python全局变量和全局列表之间的区别行为?

时间:2019-06-20 15:16:43

标签: python global-variables

我对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)

代码很容易解释,我想知道为什么会这样,其背后的逻辑是什么。此外,我还测试了字典,它的行为像一个列表。诸如类实例之类的其他东西呢?

1 个答案:

答案 0 :(得分:2)

来自Programming FAQs

  

在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]