Python多文件中导入模块的行为疑问:属性修改与重绑定差异
为什么修改模块属性能被其他文件感知,但重绑定模块变量不行?
核心逻辑:Python模块的单例特性与变量指向的区别
- Python中模块被首次导入后,会被缓存到
sys.modules字典中,后续所有import操作都是直接复用这个缓存里的同一个模块对象,不会重新执行模块代码。
两种操作的本质差异
修改
config.x的情况
script_1和script_2里的config变量,本质上都是指向sys.modules['config']这个共享的模块对象。当你在script_1里执行config.x=5时,是直接修改了这个共享对象的属性值——相当于给同一个“盒子”里的东西换了内容,不管谁拿着这个“盒子”的引用,打开都能看到新内容,所以script_2调用print_config时能拿到x=5。重绑定
config为字符串的情况
在script_1里执行config = "foo",只是改变了script_1本地作用域里config变量的指向:把它从原来的模块对象,改成了指向字符串对象。但script_2里的config变量,依然指向sys.modules里的那个模块对象,完全不受script_1本地变量重绑定的影响,所以第二次调用print_config还是输出原来的模块对象和x=5。
打个通俗的比方:
- 你和同事各拿了一把打开同一个储物间的钥匙(对应两个文件里的
config变量指向同一个模块对象)。你进去把储物间里的箱子换成了新的(修改config.x),同事进去也能看到新箱子。 - 但如果你把自己的钥匙换成了打开另一个房间的(重绑定
config为字符串),同事的钥匙还是原来那把,他打开的依然是原来的储物间。
内容的提问来源于stack exchange,提问作者lifezbeautiful
相关产品推荐
相关产品推荐

