Python的“import”是如何在内部工作的?
当你导入一个模块后,再次导入它时,这个模块会被重新导入/覆盖,还是会被跳过呢?
比如说,你导入了模块“a”和“b”,但模块“a”里面又导入了模块“b”,那么会发生什么呢?这样做安全吗?举个例子,如果模块“b”里面有一个类被实例化了,那你会不会最终实例化两次呢?
2 个回答
这个模块只会被实例化一次。也就是说,你可以在多个其他模块中安全地导入同一个模块。如果这个模块里面创建了一个类的实例(也就是一个对象),那么所有导入这个模块的地方都会访问到同一个对象。
如果你想的话,可以查看所有被导入的模块:
import sys
print sys.modules
sys.modules
是一个字典,它把模块名和模块对象对应起来。导入模块时,首先会在 sys.modules
中查找,如果找不到这个模块,就会创建一个新的模块,并把它添加到 sys.modules
中,以便以后再导入时使用。
想了解更多细节,可以看看这个页面: http://effbot.org/zone/import-confusion.htm(查看“Python导入模块时做了什么?”)
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" 里有一个类被实例化了,你会不会最终实例化两次?
不会的。