5.3.1. 模块缓存
在导入搜索期间首先会被检查的地方是 sys.modules
。 这个映射起到缓存之前导入的所有模块的作用(包括其中间路径)。 因此如果之前导入过 foo.bar.baz
,则 sys.modules
将包含 foo
, foo.bar
和 foo.bar.baz
条目。 每个键的值就是相应的模块对象。
在导入期间,会在 sys.modules
查找模块名称,如存在则其关联的值就是需要导入的模块,导入过程完成。 然而,如果值为 None
,则会引发 ModuleNotFoundError
。 如果找不到指定模块名称,Python 将继续搜索该模块。
sys.modules
是可写的。删除键可能不会破坏关联的模块(因为其他模块可能会保留对它的引用),但它会使命名模块的缓存条目无效,导致 Python 在下次导入时重新搜索命名模块。键也可以赋值为 None
,强制下一次导入模块导致 ModuleNotFoundError
。
但是要小心,因为如果你还保有对某个模块对象的引用,同时停用其在 sys.modules
中的缓存条目,然后又再次导入该名称的模块,则前后两个模块对象将 不是 同一个。 相反地,importlib.reload()
将重用 同一个 模块对象,并简单地通过重新运行模块的代码来重新初始化模块内容。