Question #
Python函数内部不能直接用 += 等修改全局变量,但是对于 list 全局变量,却可以使用 append、extend 之类修改,这是为什么呢?
Answer #
当全局变量指向的对象不可变时,比如是整型、字符串等等,如果你尝试在函数内部改变它的值,却不加关键字 global,就会抛出异常:
x = 1
def func():
x += 1
func()
x
## 输出
UnboundLocalError: local variable 'x' referenced before assignment
这是因为,程序默认函数内部的 x 是局部变量,而你没有为其赋值就直接引用,显然是不可行。不过,如果全局变量指向的对象是可变的,比如是列表、字典等等,你就可以在函数内部修改它了:
x = [1]
def func():
x.append(2)
func()
x
## 输出
[1, 2]
需要注意的是,这里的x.append(2),并没有改变变量 x,x 依然指向原来的列表。事实上,这句话的意思是,访问 x 指向的列表,并在这个列表的末尾增加 2。