导入模块时,再次重新导入,是重新导入/覆盖还是跳过? 导入模块“a”和“b”时,还在模块“a”中导入了模块“b”,会发生什么?这样做安全吗?例如,如果该模块“b”中有一个实例化的类,你最终会将它实例化两次吗?
答案 0 :(得分:5)
import
加载匹配的.py
,.pyc
或.pyo
文件,创建一个模块对象,并将其中的完全限定(“点”)名称存储在sys.modules
字典。如果第二个import
在此字典中找到要导入的模块,它将返回该模块而不再重新加载该文件。
回答你的问题:
导入模块时,再次重新导入,是重新导入/覆盖还是跳过?
它会被跳过。要明确重新导入模块,请使用reload()
内置函数。
当您导入模块“a”和“b”时,还会在模块“a”中导入模块“b”,会发生什么?
import a
将从a
加载a.py[c]
,import b
将返回sys.modules['b']
已加载的模块a
。
这样做是否安全?
是的,绝对。
例如,如果该模块“b”中有一个实例化的类,那么你最终会将它实例化两次吗?
不。
答案 1 :(得分:3)
模块只会被实例化一次。在多个其他模块中导入相同的模块是安全的。如果在模块本身中创建了一个类实例(对象),则将从导入它的所有模块中访问同一个对象。
如果您愿意,可以查看所有导入的模块:
import sys
print sys.modules
sys.modules
是将模块名称映射到模块对象的字典。 import语句的第一件事是查看sys.modules
,如果找不到那里的模块,它将被实例化,并添加到sys.modules
以供将来导入。
有关详细信息,请参阅此页面: http://effbot.org/zone/import-confusion.htm(参见“Python导入模块的作用是什么?”)