Python中sys.modules的变更如何传播?是否为进程全局共享?
关于sys.modules的两个问题解答
1. sys.modules的变更如何进行传播?
sys.modules是Python用于缓存已导入模块的全局字典,它的变更直接在整个进程内生效,无需额外传播操作:
- 当你在任意位置修改
sys.modules(比如添加新模块对象、替换已有模块、删除键值对),后续所有尝试导入对应模块的代码,都会直接读取这个字典里的最新内容。 - 举个实际场景:如果在模块A中把
sys.modules['math']替换成自定义对象,那么模块B后续执行import math时,得到的就是你替换后的自定义对象,而非标准库的math模块。
2. sys.modules是否为整个Python进程所共享,使其变更可在不同模块、exec语句(即使是exec("",{},{})形式)中被感知?还是不同上下文会有不同副本?
sys.modules是整个Python进程全局共享的单例字典,不存在上下文隔离的副本:
- 不同模块:无论在哪个模块中访问
sys.modules,都是同一个字典实例,修改会被所有模块感知。 - exec语句:哪怕使用
exec("", {}, {})这种指定空全局、局部命名空间的形式,只要exec代码中导入sys并访问sys.modules,拿到的仍是进程全局的字典。比如在exec里修改sys.modules['test'],外部代码后续import test也会获取到修改后的对象。 - 注意:如果exec代码未导入sys,仅使用局部/全局命名空间里的模块引用,那属于局部变量范畴,但只要通过
sys.modules访问,就一定是全局共享的实例。
内容的提问来源于stack exchange,提问作者DrownedSuccess
相关产品推荐
相关产品推荐

