Python 模块导入两次会发生什么情况?

Python 模块导入两次会发生什么情况?,python,module,Python,Module,我怀疑我是否想澄清 考虑以下名为ex_1.py的模块: print("Hello, I'm ex_1") def greet(name): print("Hello, "+name+" nice to meet you! ") 现在考虑另一个文件名为“代码> 1yclitNEXEX1.1.Py ,它将导入 Exp1.Py < /Cult>模块.< /P> import ex_1.py 现在,当我执行这个文件时,我得到的输出是: Hello, I'm ex_1 正如所料 但是,当我更改为1

我怀疑我是否想澄清

考虑以下名为
ex_1.py
的模块:

print("Hello, I'm ex_1")
def greet(name):
 print("Hello, "+name+" nice to meet you! ")

现在考虑另一个文件名为“代码> 1yclitNEXEX1.1.Py <代码>,它将导入<代码> Exp1.Py < /Cult>模块.< /P>

import ex_1.py
现在,当我执行这个文件时,我得到的输出是:

Hello, I'm ex_1
正如所料

但是,当我更改为
1\u client\u ex\u 1.py
时:

import ex_1.py
import ex_1.py

执行它,它仍然只打印一次。它不应该打印两次吗?

没有,如果模块已经导入,则不会再次加载

您只需获取已导入模块的引用(它将来自
sys.modules

要获得已导入模块的列表,您可以查找
sys.modules.keys()
(注意
urllib
此处导入了许多其他模块):

让我们试一试:

import sys
>>> sys.modules["foo"] = "bar"  # Let's pretend we imported a module named "foo", which is a string.
>>> print __import__("foo")
bar  # Not a module, that's my string!
如您所见,如果在sys.modules中发现一个模块,您将得到一个对它的新引用。就这样


请注意,这意味着模块的设计应确保在导入时不会产生副作用(如打印材料)。


在交互式会话之外重新加载模块通常也不是一个很好的做法(尽管它有自己的用例)-其他答案将详细说明如何执行此操作。

无,如果模块已经导入,则不会再次加载

您只需获取已导入模块的引用(它将来自
sys.modules

要获得已导入模块的列表,您可以查找
sys.modules.keys()
(注意
urllib
此处导入了许多其他模块):

让我们试一试:

import sys
>>> sys.modules["foo"] = "bar"  # Let's pretend we imported a module named "foo", which is a string.
>>> print __import__("foo")
bar  # Not a module, that's my string!
如您所见,如果在sys.modules中发现一个模块,您将得到一个对它的新引用。就这样


请注意,这意味着模块的设计应确保在导入时不会产生副作用(如打印材料)。


在交互式会话之外重新加载模块通常也不是一个很好的做法(尽管它有它的用例)-其他答案将详细说明如何执行此操作。

模块仅在第一次执行
导入
语句时加载。另见和。您可以检查
sys.modules
以找出哪些模块已经加载。

模块仅在第一次执行
import
语句时加载。另见和。您可以检查sys.modules以找出哪些模块已经加载。

Python脚本只会加载一次模块。要重新加载,请使用:

reload()      # Python 2


Python脚本将只加载一次模块。要重新加载,请使用:

reload()      # Python 2


行为是正确的行为是正确的“没有什么,如果模块已经导入,就不会再次加载。”Python(至少2.7)绝对不能保证这一点。特别是,例如,如果多个线程最终导入同一个模块,“什么都没有,如果模块已经导入,就不会再次加载。”Python(至少2.7)绝对不能保证这一点。特别是,例如,如果多个线程最终导入同一个模块。