在Python中用一行覆盖全局变量?

时间:2010-06-21 23:34:09

标签: python

我知道我可以写:

foo = 'bar'
def update_foo():
  global foo
  foo = 'baz'

但我真的需要两行代码吗? Python,唉,不允许我说

global foo = 'baz'

我还可以将这两行与不幸重复的

混合在一起
global foo; foo = 'baz'

还有其他快捷方式吗?我使用的是Python 2.6.5,但我很想知道Python 3的响应。

5 个答案:

答案 0 :(得分:14)

你可以使用我最喜欢的替代global(非常特殊的味道......):

import sys
thismodule = sys.modules[__name__]
thismodule.foo = 'bar'

def update_foo():
  thismodule.foo = 'baz'

完成thismodule引用后,您无需在此模块中使用global,因为您始终使用限定的名称而不是名称(更好的想法恕我直言......但也许仅在MHO中,我无法说服Guido提供thismodule [[或其他具有此功能的标识符]回到Python 3孕育的时候。)

请注意,在全局级别,foo的第一个作业可以使用此显式语法通过分配到名称foo来完成,就像在您的代码(我想我的偏好是明确的形式并不奇怪,但在这种情况下,只是勉强)。

答案 1 :(得分:6)

这是两个陈述,没有任何其他形式。

答案 2 :(得分:4)

你可以使用globals()字典这样写它:

def update_foo():
  globals()['foo'] = 'baz'

但我会坚持使用2行或用;方法分开。

答案 3 :(得分:3)

def update_foo():
    globals().update(foo='baz')

答案 4 :(得分:1)

如果让你感觉更好,就把它全部放在一行......

global foo; foo = 'baz'