我对python的全局变量设计感到困惑,对于普通的全局变量和全局列表而言,似乎有很大的不同,请考虑以下代码:
global_list = []
global_var = 0
def foo():
for i in range(10):
global global_var # without this, error occurs
global_var += 1
global global_list # without this, fine!
global_list.append(i)
foo()
print(global_list)
print(global_var)
代码很容易解释,我想知道为什么会这样,其背后的逻辑是什么。此外,我还测试了字典,它的行为像一个列表。诸如类实例之类的其他东西呢?
答案 0 :(得分:2)
在Python中,仅在函数内部引用的变量是隐式全局的。如果在函数体内任何位置为变量分配了值,除非明确声明为全局变量,否则假定该变量为局部变量。
写时:
global_var += 1
在您引用了全局版本后,正在给一个名称global_var
赋值+=
构造需要读取全局变量然后将其重新赋值-等效到:
global_var = global_var + 1
^ ^
| |--global reference
|- local assignment
根据上述规则,除非声明为global,否则将其设为局部变量,但您已经引用了global。
写时:
global_list.append(i)
您没有为名称global_list
分配新值。 global_list
仍指向相同的数组,字典也会发生相同的情况。如果您尝试使用类似以下的命令重新分配,则需要声明global global_list
:
global_list = global_list + [i]