- 零基础学Python(第2版)
- 黄传禄 张克强 赵越
- 1318字
- 2025-03-22 17:26:48
2.3.4 全局变量
全局变量是能够被不同的函数、类或文件共享的变量,在函数之外定义的变量都可以称为全局变量。全局变量可以被文件内部的任何函数和外部文件访问。例如,如果文件1中定义了一个全局变量,文件1中的函数fun()可以访问该全局变量。此外,该全局变量也能被文件2、文件3访问,如图2-3所示。

图2-2 局部变量的作用范围

图2-3 全局变量的作用范围
全局变量通常在文件的开始处定义。【例2-5】定义了两个全局变量_a、_b和两个函数add()、sub(),这两个函数将调用全局变量执行加法和减法计算。
【例2-5.py】
01 # 在文件的开头定义全局变量 02 _a = 1 03 _b = 2 04 def add(): 05 global _a 06 _a = 3 07 return "_a + _b =", _a + _b 08 def sub(): 09 global _b 10 _b = 4 11 return "_a - _b =", _a - _b 12 print (add()) 13 print (sub())
【代码说明】
·第2行代码定义了一个名为_a的全局变量,这个变量的作用范围从定义处到文件的结尾。之所以使用下划线是为了区分于其他变量,引起程序员对全局变量出现的重视。
·第3行代码定义了一个名为_b的全局变量。同样,变量_b的作用范围从定义处到文件的结尾。
·第4行代码定义了一个函数add(),用于执行加法计算。
·第5行代码引用全局变量_a。这里使用了global关键字,global用于引用全局变量。
·第6行代码对全局变量_a重新赋值。
·第7行代码返回_a+_b的值。
·第8行代码定义了一个函数sub(),用于执行减法运算。函数内的实现方式和add()相同。
·第12代码调用函数add()。输出结果如下。
('_a + _b =', 5)
·第13行代码调用函数sub()。输出结果如下。
('_a - _b =', -1)
如果不使用global关键字引用全局变量,而直接对_a、_b赋值,将得到错误的结果。
01 # 错误地使用全局变量 02 _a = 1 03 _b = 2 04 def add(): 05 _a = 3 06 return "_a + _b =", _a + _b 07 def sub(): 08 _b = 4 09 return "_a - _b =", _a - _b 10 print (add()) 11 print (sub())
【代码说明】
·第5行代码中的_a并不是前面定义的全局变量,而是函数add()中的局部变量。虽然输出的结果相同,但是运算的对象并不相同。
·第6行代码中的_b还是前面定义的全局变量_b。
·第8行代码中的_b是局部变量。
·第10行代码的输出结果如下。
('_a + _b =', 5)
·第11行代码的输出结果如下。
('_a - _b =', -3)
注意 变量名相同的两个变量可能并不是同一个变量,变量的名称只是起标识的作用。变量出现的位置不同,变量的含义也不同。
同样可以把全局变量放到一个专门的文件中,便于统一管理和修改。创建一个名为gl.py的文件。
01 # 全局变量 02 _a = 1 03 _b = 2
【代码说明】pl.py创建了两个全局变量_a和_b。
再创建一个调用全局变量的文件use_global.py。
01 # 调用全局变量 02 import gl 03 def fun(): 04 print(gl._a) 05 print(gl._b) 06 fun()
【代码说明】
·第2行代码导入前面创建的文件gl.py,即模块gl。
·第3行代码定义了一个函数fun(),该函数调用全局变量_a和_b。这里不需要使用global引用gl.py中的全局变量,因为前导符可以定位全局变量_a和_b。
·第4行代码输出_a的值,使用前导符gl定位。输出结果:
1
·第5行代码输出_b的值,使用前导符gl定位。输出结果:
2
·第6行代码调用fun()。
应该尽量避免使用全局变量。因为不同的模块都可以自由地访问全局变量,可能会导致全局变量的不可预知性。对于gl.py中的全局变量,如果程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能导致程序中的错误。这种错误是很难发现和更正的。
全局变量降低了函数或模块之间的通用性,不同的函数或模块都要依赖于全局变量。同样,全局变量降低了代码的可读性,阅读者可能并不知道调用的某个变量是全局变量。