为什么跨Python文件引用的同一list变量id不一致?
问题根本原因
这个现象是Python入口模块的命名规则 + 循环导入共同导致的,核心是test1.py被加载了两次,生成了两个独立的模块实例:
- 当你直接执行
python test1.py时,Python会把这个脚本作为程序入口,对应的模块名称是__main__,而非test1。此时会初始化__main__模块的全局变量box = [],后续你在run函数里追加20、30,操作的都是__main__模块下的box,也就是你打印的id为4320983560的对象。 - 当
run函数执行到from test2 import b时,Python会加载test2模块,执行test2的顶层代码。 test2第一行是from test1 import box,此时Python会在已加载的模块缓存里查找名为test1的模块,找不到就会重新执行一遍test1.py的所有顶层代码,生成一个名为test1的全新模块实例,这个模块里也会初始化自己的全局变量box = [],就是你打印的id为4320994504的对象,和__main__模块的box完全无关。- 后续
test2里操作的都是test1模块的box,追加40后赋值给b,所以最终打印出来的b是[40],和__main__里的[20,30]互不影响。
验证方式
你可以在test1.py的最顶层加一行打印代码:
print(f"当前模块名:{__name__},box id:{id(box)}")
再次运行就能看到两次打印,一次模块名是__main__,一次是test1,对应两个不同的box id,直接验证上述结论。
解决方法
- 推荐方案:把公共变量拆分到独立的第三方模块,比如新建
common.py,在里面写box = [],test1.py和test2.py都从common导入box,就能保证全局唯一。 - 临时兼容方案:
test2.py里改为从__main__导入box:from __main__ import box,但这种写法耦合性极强,只适合临时调试,不建议生产环境使用。
内容的提问来源于stack exchange,提问作者Xhhhhh
相关产品推荐
相关产品推荐

