Python的“导入”如何在内部工作?

时间:2011-12-02 15:03:12

标签: python import module

导入模块时,再次重新导入,是重新导入/覆盖还是跳过? 导入模块“a”和“b”时,还在模块“a”中导入了模块“b”,会发生什么?这样做安全吗?例如,如果该模块“b”中有一个实例化的类,你最终会将它实例化两次吗?

2 个答案:

答案 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导入模块的作用是什么?”)