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)绝对不能保证这一点。特别是,例如,如果多个线程最终导入同一个模块。