2010-06-21 76 views
7

我知道我可以写:在Python中用一行覆盖全局变量?

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

但我真的需要代码有两行呢? Python的,唉,不会让我说

global foo = 'baz' 

我也与不幸重复

global foo; foo = 'baz' 

任何其他快捷方式两线一起混搭?我使用的是Python 2.6.5,但我很好奇听到Python 3的响应。

+2

这样练习的目的是什么?当使用'global'时,你声明你打算干涉不属于你的变量(大概是其他人做的) - 但是为什么你会在检查它里面的内容之前马上重写它?似乎没有实际意义... – 2010-06-21 23:46:02

+0

我同意,我一直想这样做。我也想要更聪明的元组解开包装,但是你不能赢得他们全部:) – 2010-06-22 01:24:58

回答

12

你可以使用我最喜爱的替代global(一个相当奇特的味道......):

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

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

一旦你取得了thismodule参考,你并不需要在此模块中使用global,因为你总是有工作合格的名字而不是的名字(一个好得多的想法恕我直言...但也许只在MHO中,我还没有能够说服Guido提供thismodule [[或某些其他标识符与此功能]]时,Python 3正在孕育)。

注意第一个分配给foo,在全球范围内,可以将其分配给barename foo,你在你的代码做(我想这并不奇怪,我的喜好去进行任何与此明确的语法,尽管如此,在这种情况下,几乎没有)。

+0

给模块一个'this'关键字?由于某种原因,只是给了我heebiejeebies。如果我是圭多,我会让全球声明包括一个巨大的红色闪烁警告标志。 – 2010-06-22 00:07:56

+0

你刚刚开启了我的想法,达到了这个金块的全新多功能领域。干杯! – Ephexx 2017-01-31 00:03:41

6

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

+0

+1:就是这样。 – 2010-06-21 23:54:09

+0

......只有当你发誓只使用裸号...... ;-)。 – 2010-06-22 00:00:36

3

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

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

,但我只想坚持与2线或用;方法分离。

+0

确实,尽管通常不会推荐使用'globals()'(甚至更多的'locals()')。 – 2010-06-21 23:41:36

+1

从http://www.python.org/dev/peps/pep-0020/开始,“显式比隐式更好”。 – 2010-06-21 23:47:32

1

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

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