Python跨模块导入全局变量后修改不生效问题咨询
问题:Python跨模块修改全局变量后未同步的疑惑
我有两个Python文件:
main.py 代码
globvar = 0 def set_globvar_to_one(): global globvar # 声明要修改全局作用域的globvar globvar = 1
cs.py 代码
from main import globvar from main import set_globvar_to_one def print_globvar(): print(globvar) # 读取变量不需要global声明 set_globvar_to_one() print_globvar()
运行cs.py时输出为0,但我预期结果是1——明明调用了修改main.py全局变量的函数,也导入了globvar,请问哪里理解错了?
原因与解决方法
核心原因
当你用from main import globvar导入变量时,Python会把main.py中globvar的当前值(初始是0)复制一份,放到cs.py自己的命名空间里。这两个globvar是完全独立的对象:
- 调用
set_globvar_to_one()确实把main.py里的globvar改成了1,但cs.py里的那个复制版还是0,所以打印出来的是旧值。
解决方法
方法1:导入整个模块,通过模块名访问变量
修改cs.py,直接导入main模块,每次通过main.globvar访问变量,这样拿到的永远是main.py里的最新值:
import main from main import set_globvar_to_one def print_globvar(): print(main.globvar) set_globvar_to_one() print_globvar()
方法2:新增获取全局变量的接口函数
在main.py里添加一个专门返回全局变量的函数,cs.py通过调用这个函数拿到最新值:
修改后的main.py:
globvar = 0 def set_globvar_to_one(): global globvar globvar = 1 def get_globvar(): return globvar
修改后的cs.py:
from main import set_globvar_to_one, get_globvar def print_globvar(): print(get_globvar()) set_globvar_to_one() print_globvar()
内容的提问来源于stack exchange,提问作者amitsuneja
相关产品推荐
相关产品推荐

