我正在尝试使用此代码:
def a():
#global p
p.append(4);
d=9
p=[2,3];
d=8
a();
print p # ----> [2, 3, 4]
print d # ----> 8
变量d
值未更改,因为我没有使用global
关键字。但即使我没有使用p
,列表global
也会在功能中进行修改。默认情况下,所有列表global
都在函数中吗?
答案 0 :(得分:1)
关键区别在于此处的分配。您可以在现有全局对象上调用方法,但无法在不调用global
的情况下分配给它们。在您的代码中,名称d
正在重新分配以引用另一个值。如果您更改p
并执行了作业,那么您将获得类似的结果
def a():
p = [5, 7] # new local variable, doesn't change global
p.append(9) # doesn't change global p
如果你想一想python第一次遇到这个名字会发生什么,这是有道理的。在您提供的功能中,python会看到p.append
并说出"嗯,我没有名字p
的本地人,让我看一下封闭的内容。范围"它会看到全局p
并使用它。
在我已经展示的示例中,python会说"没有明确的global
所以我认为这应该是一个新的局部变量。"并创建一个。
python中的名称只是引用。如果python遵循你期望的行为,你需要为你调用的每个函数global
,请让我解释一下:
def a():
p.append(1) # I should need 'global p' to do this
这意味着如果你有
def g():
...
def f():
g() # this would also need 'global g', otherwise how does it see g?
def f2():
global g
def g(): # changes the global g function
return 0