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

3
当你导入一个模块,然后再次重新导入它,会被重新导入/覆盖,还是跳过? 当你导入模块"a"和"b",但同时在模块"a"中也导入了模块"b",会发生什么?这样做安全吗?例如,如果模块"b"中实例化了一个类,你会不会最终实例化两次?

2
文档在这方面似乎很清楚。文档的哪个部分让你感到困惑?你能提供具体的引用或链接,指出让你感到困惑的部分吗?目前不清楚哪一部分令人困惑。例如,http://docs.python.org/tutorial/modules.html#more-on-modules 看起来很清晰。你能解释一下其中哪一部分让你感到困惑吗? - S.Lott
2个回答

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”中实例化了一个类,您会实例化两次吗?
不会的。

3
该模块只会被实例化一次。在多个其他模块中导入相同的模块是安全的。如果在该模块本身中创建了一个类实例(对象),则所有导入它的模块都将访问完全相同的对象。
如果您愿意,可以查看所有导入的模块:
import sys
print sys.modules

sys.modules是一个字典,它将模块名称映射到模块对象。import语句的第一件事就是查找sys.modules,如果找不到该模块,它将被实例化并添加到sys.modules以供未来导入使用。

请参阅此页面了解更多详细信息:http://effbot.org/zone/import-confusion.htm(请查看“Python导入模块时做了什么?”)


好答案!当第一次导入时,会初始化一个 types.ModuleType 类型的对象,当第二次导入时,只会创建对该对象的引用。 - Ski
注意:如果你运行一个模块(__name__ == "__main__"),并且从另一个模块中导入了这个模块,那么这个模块会被执行两次!(第二次执行时,__name__ 等于模块名) 例如: main.py: import xxx xxx.py: import main 运行:python main.py - gecco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接