Python使用global声明仍无法实现跨模块变量全局访问求助
问题分析与解决
你这里的核心问题是:from ... import导入的是变量的副本,而global关键字仅作用于当前模块的全局命名空间,根本没触及vars.py里的原始变量。
具体原因
当你在init.py中执行from vars import barry时,Python会把vars.py里barry的当前值复制一份,存入init.py自己的全局命名空间。之后你在init()函数里写global barry,只是声明要操作init.py内部的这个全局副本,而非vars.py里的原始变量。所以你修改的只是init.py里的副本,vars.py和main.py中的barry自然不会同步变化。
解决方法
方法1:导入整个vars模块,直接操作模块内变量
这是最直接的方式,所有操作都针对vars模块的原始变量:
修改init.py:
import vars def init(): print(f'old barry = {vars.barry}') vars.barry = 'terminal' print(f'New barry = {vars.barry}')
修改main.py:
#!/usr/bin/env python3 import vars from init import init print(f'In Main, barry = {vars.barry}') init() print(f'In Main, after init , barry = {vars.barry}')
方法2:让init()返回修改后的值,由main.py主动更新
这种方式避免了模块间的隐式依赖,更符合函数设计原则:
修改init.py:
from vars import barry def init(): print(f'old barry = {barry}') new_barry = 'terminal' print(f'New barry = {new_barry}') return new_barry
修改main.py:
#!/usr/bin/env python3 from vars import barry from init import init print(f'In Main, barry = {barry}') barry = init() print(f'In Main, after init , barry = {barry}')
方法3:在init.py中同时导入模块与变量,同步修改
如果一定要保留from ... import的写法,可以同时导入vars模块本身来修改原始变量:
from vars import barry import vars def init(): global barry print(f'old barry = {barry}') vars.barry = 'terminal' barry = vars.barry # 同步当前模块的副本 print(f'New barry = {barry}')
main.py无需修改,运行后也能得到预期结果,但这种方式相对冗余,不推荐优先使用。
内容的提问来源于stack exchange,提问作者ALP
相关产品推荐
相关产品推荐

