已加载模块的导入行为

时间:2014-01-05 19:09:44

标签: python

鉴于这种情况:

Foo.py:

import another_module

def foo():
#some code

它由不同的模块调用,其中一些已经import another_module,有些则没有。(让我们称其中一个'main.py')

  
      
  1. 哪个是默认行为?模块是否重新加载?如果是,(这只是好奇心)让我们假设another_module在main中的import和foo.py中的import中发生了变化。 Python在内存中有两个不同版本的another_module,一个可以foo.py访问,一个main.py
  2.   
  3. 如果import another_module已经完成了main,是否还有办法?
  4.   
  5. 如果在主要内容from another_module import f1和foo.py from another_module import f1,f2中,它是如何工作的.f2只是“添加”还是重新加载模块?
  6.   

1 个答案:

答案 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