只有在试图更改变量引用的对象时,global才需要。因为vals[0] = 5更改的是实际对象而不是引用,因此不会引发错误。但是,使用vals += [5, 6],解释器试图找到一个局部变量,因为它不能改变全局变量。在
令人困惑的是,在list中使用+=运算符会修改原始列表,比如vals[0] = 5。尽管vals += [5, 6]失败,vals.extend([5, 6])起作用。我们可以请^{}帮我们提供一些线索。在>>> def a(): v[0] = 1
>>> def b(): v += [1]
>>> def c(): v.extend([1])
>>> import dis
>>> dis.dis(a)
1 0 LOAD_CONST 1 (1)
3 LOAD_GLOBAL 0 (v)
6 LOAD_CONST 2 (0)
9 STORE_SUBSCR
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(b)
1 0 LOAD_FAST 0 (v)
3 LOAD_CONST 1 (1)
6 BUILD_LIST 1
9 INPLACE_ADD
10 STORE_FAST 0 (v)
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
d
>>> dis.dis(c)
1 0 LOAD_GLOBAL 0