在Python中将列表定义为全局变量

Hos*_*ein 11 python list global-variables

我正在使用一个列表,其中一些函数在我的程序中工作.这实际上是一个共享列表,我的所有功能都可以编辑它.是否真的有必要在所有功能中将其定义为"全局"?

我的意思是将global关键字放在每个使用它的函数中,或者在不使用其定义背后的全局字的情况下在所有函数之外定义它是否足够?

小智 25

分配变量(x = ...)时,您将在当前范围中创建变量(例如,当前函数的本地变量).如果它碰巧在外部(例如全局)范围内影响变量,那么太糟糕了 - Python并不关心(这是一件好事).所以你不能这样做:

x = 0
def f():
    x = 1
f()
print x #=>0
Run Code Online (Sandbox Code Playgroud)

期待1.相反,你需要声明你打算使用global x:

x = 0
def f():
    global x
    x = 1
f()
print x #=>1
Run Code Online (Sandbox Code Playgroud)

但请注意,变量的赋值与方法调用非常不同.您总是可以在范围内调用任何方法 - 例如,来自外部(例如全局)范围的变量,因为没有任何局部阴影它们.

同样非常重要的是:成员赋值(x.name = ...),项目赋值(collection[key] = ...),切片赋值(sliceable[start:end] = ...)以及更多的方法调用也是如此!因此,您不需要global更改全局成员或调用它的方法(即使它们改变了对象).

  • +1.值得注意的是,切片分配不会覆盖参考.特别是,代替`x = newlist`,可以做`x [:] = new_list`,但仍然不需要使用`global`.这当然包含在方法调用案例中,但值得明确指出. (4认同)

Tay*_*ese 9

是的,global foo如果要写入,则需要使用。

foo = []

def bar():
    global foo
    ...
    foo = [1]
Run Code Online (Sandbox Code Playgroud)

  • 虽然不是严格错误(在示例中,`global` 是必要的),这是误导。首先,许多人似乎不同意 Python 的“写入时间”的概念。 (2认同)
  • @Hossein:任何变量都是一样的。引用的对象无关紧要。 (2认同)