关于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是可变类型的变量,那对于不可变类型的元组呢?

 

说到底可能还是由于变量在内存中的地址自始至终没有改变:

 

 

 

 

你觉得呢?

 

posted @ 2022-11-13 22:59  天青色wy  阅读(1137)  评论(0编辑  收藏  举报