鉴于这种情况:
Foo.py:
import another_module
def foo():
#some code
它由不同的模块调用,其中一些已经import another_module
,有些则没有。(让我们称其中一个'main.py')
- 哪个是默认行为?模块是否重新加载?如果是,(这只是好奇心)让我们假设another_module在main中的import和
foo.py
中的import中发生了变化。 Python在内存中有两个不同版本的another_module
,一个可以foo.py
访问,一个main.py
?- 如果
import another_module
已经完成了main
,是否还有办法?- 如果在主要内容
醇>from another_module import f1
和foo.pyfrom another_module import f1,f2
中,它是如何工作的.f2只是“添加”还是重新加载模块?
答案 0 :(得分:2)
不,模块不会重新加载。您可以使用reload()
功能重新加载模块。导入模块后,它将被添加到sys.modules
字典中。正如文档所述,您还可以通过更改此变量的内容来强制重新加载模块:
这可以被操纵以强制重新加载模块和其他技巧。请注意,从此字典中删除模块与在相应模块对象上调用reload()不同。
from
语句与此行为没有任何区别。它只是控制加载模块的哪些部分被添加到当前范围:
导入语句分两步执行:(1)找到一个模块,并在必要时进行初始化; (2)在本地名称空间(发生import语句的作用域)中定义一个或多个名称。该语句有两种形式,它们是否使用from关键字。第一种形式(没有来自)为列表中的每个标识符重复这些步骤。带有from的表单执行步骤(1)一次,然后重复执行步骤(2)。
您可以自己轻松验证:
<强> y.py 强>:
print "Y"
def f1():
pass
def f2():
pass
<强> x.py 强>:
print "X"
from y import f1, f2
<强> test.py 强>:
from y import f1
import x
print "reload"
reload(x)
python test.py
Y
X
reload
X