Python的“import”是如何在内部工作的?

3 投票
2 回答
726 浏览
提问于 2025-04-17 07:33

当你导入一个模块后,再次导入它时,这个模块会被重新导入/覆盖,还是会被跳过呢?

比如说,你导入了模块“a”和“b”,但模块“a”里面又导入了模块“b”,那么会发生什么呢?这样做安全吗?举个例子,如果模块“b”里面有一个类被实例化了,那你会不会最终实例化两次呢?

2 个回答

3

这个模块只会被实例化一次。也就是说,你可以在多个其他模块中安全地导入同一个模块。如果这个模块里面创建了一个类的实例(也就是一个对象),那么所有导入这个模块的地方都会访问到同一个对象。

如果你想的话,可以查看所有被导入的模块:

import sys
print sys.modules

sys.modules 是一个字典,它把模块名和模块对象对应起来。导入模块时,首先会在 sys.modules 中查找,如果找不到这个模块,就会创建一个新的模块,并把它添加到 sys.modules 中,以便以后再导入时使用。

想了解更多细节,可以看看这个页面: http://effbot.org/zone/import-confusion.htm(查看“Python导入模块时做了什么?”)

7

import 这个命令会加载对应的 .py.pyc.pyo 文件,创建一个模块对象,并把它用完整的名字存储在 sys.modules 这个字典里。如果你第二次使用 import 来导入这个模块,系统会先在这个字典里查找,如果找到了,就不会再加载文件了。

来回答你的问题:

当你导入一个模块后,再次导入它,会重新导入/覆盖,还是跳过?

会跳过。如果你想明确地重新导入一个模块,可以使用 reload() 这个内置函数。

如果你导入了模块 "a" 和 "b",而且模块 "a" 里也导入了模块 "b",会发生什么?

import a 会从 a.py[c] 中加载 a,而 import b 会返回已经被 a 加载的模块 sys.modules['b']

这样做安全吗?

是的,绝对安全。

比如说,如果模块 "b" 里有一个类被实例化了,你会不会最终实例化两次?

不会的。

撰写回答