关于python中的全局变量
先看一下这段代码:
请问执行代码的输出是什么?先想想,别看答案。
1
2
3
4
5
6
7
8
9
0
答案是:
代
码
有
b
u
g
,
直
接
报
错
。
为什么呢?先看以下场景:
定义一个全局变量a=1,函数f()内部打印a的值,如下,输出1,没问题。
在函数内部加上a=a+1,运行报错,125行,说局部变量a赋值前调用:
print语句在赋值语句上面也是一样在125行报错:
若加上global声明a为全局变量,则正常输出2:
问题来了,为何直接print(a)没问题,而添加赋值语句之后就会报错呢?
这是因为在函数内部对变量进行assignment赋值操作时,python会默认该变量是一个局部变量local variable。这与赋值语句的位置无关,在编译的时候就已经决定了。所以进行a=a+1的赋值操作时,python会认为等号"="左边的变量a为局部变量,当代码执行到函数里边时,所有的a都是局部变量,在运算等号右边的a+1时,就会发现局部变量a并没有被定义,因此报错。如果print(a)语句在赋值语句上边,结果一样,你要打印的局部变量a没有被定义。
所以回到开头:
闭包内也是一样:没有局部变量就找外面的nonlocal
没有nonlocal,就找最外边的global:
赋值打印情况同上:
总结:
1、全局变量可读不可直接写。
2、函数内部对变量的赋值操作会被python默认变量为局部变量,且在未执行代码前已经确定。
对于第一点,若全局变量是个字典或列表类型,对变量的值的修改算是写吗?如下:
很显然函数内部的a均为全局变量。你可能会说a是可变类型的变量,那对于不可变类型的元组呢?
说到底可能还是由于变量在内存中的地址自始至终没有改变:
你觉得呢?