循环导入场景下Python全局变量跨模块读取更新值问题咨询
问题根源
直接运行python a.py时,a会被识别为__main__主模块加载,而b.py中执行import a as my_a时,Python会将a作为普通模块重新加载一次,导致程序中存在两个完全独立的模块实例:你在main函数里修改的是主模块__main__下的x变量,b读取的是普通a模块下的x变量,因此看不到更新。
最简修改方案
无需修改b.py的任何代码,仅需调整a.py的开头,将当前主模块注册到系统模块缓存中,让b导入a时直接复用当前运行的主模块实例即可:
修改后的a.py代码如下:
import sys # 让后续导入a模块的操作直接复用当前主模块实例 sys.modules['a'] = sys.modules['__main__'] x = {} from b import * def main(): global x x[0] = 'hello' foo() if __name__ == '__main__': main()
运行后即可输出期望结果{0: 'hello'}。
替代方案
如果你不想修改系统模块缓存,也可以直接修改b读取的普通a模块下的x变量,改动同样很小:
x = {} # 先导入普通a模块实例 import a from b import * def main(): # 直接修改普通a模块下的x,和b读取的变量保持一致 a.x[0] = 'hello' foo() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者user650261
相关产品推荐
相关产品推荐

