Python中global关键字的作用域与模块导入详解
本文深入解析Python中global关键字的用法,探讨其在函数、类及跨模块导入场景下的行为。重点说明global如何将局部变量提升为全局变量,并揭示通过from...import导入时,global定义的变量不会自动加入调用模块全局命名空间的特性,结合__globals__属性分析常见报错原因。
近期有开发者咨询关于global关键字的具体应用,本文借此机会对该关键字的使用机制进行梳理和总结。
要准确掌握global关键字,需先厘清Python中全局变量与局部变量的区别。global关键字的核心功能是声明一个局部变量为全局变量,以下通过具体实例进行演示。
一、变量作用域的基本概念
此处简要回顾变量作用域的定义,感兴趣的读者可查阅相关技术博客获取更详尽的理论支持。
1、局部变量
def a(): ## 菊部变量 - ,- local = 1 print(local) ## 全局无法使用,只有自己可用 print(lobal)
2、全局变量
global_str = '123' def a(): ## 全菊变量 - ,- print(global_str) ## 全菊变量大家都可以用 print(global_str)
3、内置作用域
指系统固定模块中预定义的变量,例如内置在builtin模块内的变量。此处不再展开介绍。
4、嵌套作用域
该作用域使用频率较低,主要应用于闭包场景,参考以下示例。
def out():
## 函数内变量,但对于下级函数就是全局变量,对于外部来说就是局部变量
en = 1
def inside():
print(en)
return en
return inside()
out()
二、global关键字的具体作用
1、在函数间使用global关键字的效果
def out(): ## global关键字作用 global en en = 1 ## 调用other可以打印en,去掉global会报错。 other() print(out.__globals__) def other(): print(en) out()
2、在类定义中同样适用,此处不再赘述,建议在类中使用self引用实例属性。
3、跨文件导入场景:若在其他文件中定义并导入上述代码,会发生什么?请参考以下示例,假设a文件包含前述代码。
from report.a import * out() print(out.__globals__['en'])
运行结果如下:
1 1
程序正常执行,未出现报错。
接下来探讨一个问题:如果在另一个文件中继续定义函数,是否可以直接使用a文件中通过global声明的全局变量?
from report.a import out def b(): print(out.__globals__['en']) ## 直接飙红了。 -,- print(en) b()
实际运行中会出现报错:
Traceback (most recent call last): File "/Users/dangfuli/Documents/PycharmProjects/asp/report/b.py", line 9, in <module> b() File "/Users/dangfuli/Documents/PycharmProjects/asp/report/b.py", line 6, in b print(out.__globals__['en']) KeyError: 'en'
这表明,当通过import导入包时,global定义的全局变量并未被添加到调用模块的globals命名空间中。
5、前文多处使用了func.__globals__属性,运行以下代码观察实例。
def out():
## global关键字作用
global en
en = 1
other()
print(out.__globals__)
## 调用other可以打印en
def other():
print(en)
out()
## 返回结果
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10306a7b8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/xxx/Documents/PycharmProjects/xxx/report/a.py', '__cached__': None, 'out': <function out at 0x101fcee18>, 'other': <function other at 0x1033f8c80>, 'en': 1}
结果显示,当前函数使用global声明后,变量en已被添加至该函数的globals字典中。
接下来观察导入到其他模块后的表现。
# a.py def out(): ## global关键字作用 global en en = 1 other() print(out.__globals__['en']) ## 调用other可以打印en def other(): print(en) #############上面是a文件,下面是b文件############# # b.py from report.a import out def b(): ## globals里面没有en那个全局变量 out() print(b.__globals__['en']) b()
查看运行结果:
1 Traceback (most recent call last): File "/Users/xxx/Documents/PycharmProjects/xxx/report/b.py", line 8, in <module> b() File "/Users/xxx/Documents/PycharmProjects/xxx/report/b.py", line 6, in b print(b.__globals__['en']) KeyError: 'en'
可以看到,导入的a文件代码正常运行,但在b文件中尝试打印en变量时发生报错。
以上内容为本文的全部讲解,希望能为读者的学习提供有益参考,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













