【问题标题】:Modifying global variable with same name as local variable修改与局部变量同名的全局变量
【发布时间】:2012-04-19 20:10:38
【问题描述】:

假设我有一个全局变量a。在函数定义中,我们还有一个名为a 的局部变量。有没有办法将全局变量的值赋值给局部变量的值?

a = 'foo'

def my_func(a = 'bar'):
    # how to set global a to value of the local a?

【问题讨论】:

  • 在函数定义中使用'global a'语句?
  • @newtover:但是我无法访问本地a 的值以将其分配给全局值。
  • WHY???!!1!11one|11!1ELEVE|\|1!?。首先,使用全局变量是一种不好的做法,向您的函数添加参数或创建一个类。其次,为什么要在不同的上下文中使用相同的变量名并关联它们的内容。你能更努力地让你的代码变得更丑陋和混乱吗?
  • 这正是不鼓励使用全局变量的原因。即使有办法做到这一点,你也不应该这样做。更改局部变量名称,或者——更好的是——不要使用全局变量。
  • 聚会有点晚了,但每当我遇到本地/全局冲突问题时,我都会使用一个空类作为命名空间容器(class Container(): passsettings = Container()settings.a = 'foo')并存储我的全局变量在那里。它既可变又可区分:if var1 is None: var1 = settings.var1else: settings.var1 = var1 等等。

标签: python global-variables


【解决方案1】:

使用built-in function globals()

globals()

返回一个表示当前全局符号的字典 桌子。这始终是当前模块的字典(在 函数或方法,这是定义它的模块,而不是 调用它的模块)。

a = 'foo'

def my_func(a = 'bar'):
    globals()['a'] = a

顺便说一句,值得一提的是,全局只是模块范围内的“全局”。

【讨论】:

  • 您能否通过在此处详细说明什么是模块来进一步解释您提供的“全局只是模块范围内的“全局””的说明?
  • @SaurabhSaha 通常是单个文件。模块,例如可以是 import-ed docs.python.org/3/tutorial/modules.html
  • 谢谢@vartec。这意味着我们可以在不同的模块中拥有同名的全局变量。
【解决方案2】:
>>> a = 'foo'
>>> def my_func(a='bar'):
...     return globals()['a']
...
>>> my_func()
'foo'

【讨论】:

    【解决方案3】:

    不要一开始就混淆全局和本地命名空间。尽可能尝试使用局部变量而不是全局变量。如果您必须在作用域之间共享变量,您仍然可以传递变量而无需全局占位符。局部变量的引用也比全局变量更有效地访问。

    几个链接:

    Sharing Variables in Python

    Variable performance

    【讨论】:

      【解决方案4】:

      让python知道你想要全局版本;

      def my_func():
          global a
          a = 'bar'
      

      【讨论】:

      • 对不起,改写了这个问题。我想将全局a 设置为本地a 的值。
      猜你喜欢
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多