我正在使用一个列表,其中一些函数在我的程序中有效。这实际上是一个共享列表,我的所有功能都可以编辑它。是否真的有必要在所有功能中将其定义为“全局”?
我的意思是将global关键字放在每个使用它的函数中,或者在不使用其定义背后的全局字的情况下在所有函数之外定义它就足够了吗?
答案 0 :(得分:23)
分配变量(x = ...
)时,您将在当前范围内创建变量(例如,当前函数的本地变量)。如果它碰巧在外部(例如全局)范围内影响变量,那么太糟糕了 - Python并不关心(这是一件好事)。所以你不能这样做:
x = 0
def f():
x = 1
f()
print x #=>0
并期待1
。相反,您需要声明您打算使用global x
:
x = 0
def f():
global x
x = 1
f()
print x #=>1
但请注意,变量的赋值与方法调用非常不同。您可以随时调用范围内的任何方法 - 例如来自外部(例如全局)范围的变量,因为没有任何局部阴影它们。
非常重要:成员分配(x.name = ...
),项目分配(collection[key] = ...
),切片分配(sliceable[start:end] = ...
)以及更多可能是所有方法调用还有!因此,您不需要global
来更改全局成员或将其称为方法(即使他们改变了对象)。
答案 1 :(得分:4)
是的,如果您要写信,则需要使用global foo
。
foo = []
def bar():
global foo
...
foo = [1]
答案 2 :(得分:1)
不,您可以将列表指定为您的函数的关键字参数。
alist = []
def fn(alist=alist):
alist.append(1)
fn()
print alist # [1]
我会说这是不好的做法。有点太hackish。如果你真的需要使用全局可用的类似单例的数据结构,我会使用模块级变量方法,即 将'alist'放在一个模块中,然后在其他模块中导入该变量:
在文件foomodule.py中:
alist = []
在文件barmodule.py中:
import foomodule
def fn():
foomodule.alist.append(1)
print foomodule.alist # [1]