重新加载模块是否会更改先前导入/重新加载的模块中的名称?

时间:2014-02-23 06:30:29

标签: python

我有一个名为myfile.py

的模块
    //myfile.py
    msg = 'Hello World'

然后我导入它:import myfile

然后我做了一些修改,例如:

    //myfile.py (updated)
    a = 'Some text'
    b = 'Some other text'

然后我调用重载函数:

    from imp import reload
    reload(myfile)

现在我跑的时候:dir(myfile) 它显示当前模块重新加载的名称以及之前的(所有其他先前的导入/重新加载)

当导入/重新加载模块时,这是否意味着“所有”名称(更新后省略的名称)可以单独用于外部世界吗?

2 个答案:

答案 0 :(得分:1)

来自imp.reload documentation

  

重新加载模块时,保留其字典(包含模块的全局变量)。名称的重新定义将覆盖旧的定义,因此这通常不是问题。如果新版本的模块未定义旧版本定义的名称,则旧定义仍为

重新加载前不擦除模块。该模块的新代码在所有旧的变量绑定仍然存在的情况下执行。新代码定义的任何名称都会替换旧的绑定,但新版本未定义的任何内容都会保留其旧值。 This also applies in Python 2

答案 1 :(得分:0)

使用可以使用Python的内置函数reload。来自文档:

  

执行重装(模块)时:

     
      
  • 重新编译Python模块的代码并重新执行模块级代码,定义一组绑定到名称的新对象
      在模块的字典中。扩展模块的init功能是   第二次不叫。
  •   
  • 与Python中的所有其他对象一样,只有在引用计数降为零后才会回收旧对象。
  •   
  • 模块名称空间中的名称将更新为指向任何新对象或已更改的对象。
  •   
  • 对旧对象的其他引用(例如模块外部的名称)不会反弹以引用新对象,必须是   如果需要,在每个命名空间中更新它们。
  •   

以下是一个例子:

首先,我们创建一个定义变量msg的文件和一个打印它的方法。

// myfile.py
msg = 'Hello World'
def x():
    print msg

// run from the shell
shell1$ python
>>> import myfile
>>> myfile.x()
Hello World

现在我们修改文件,删除变量msg并添加ab变量(不退出当前的Python REPL)。

// myfile.py - updated
a = 'Some text'
b = 'Some other text'
def x():
    print '%s: %s' % (a, b)

// run from the same python session
>>> reload(myfile)
<module 'myfile' from 'myfile.pyc'>
>>> myfile.x()
Some text: Some other text

如果您使用外部编辑器编辑了模块源文件并希望在不离开Python解释器的情况下试用新版本,这将非常有用。

最后一点:reload(myfile)仅重新加载指定的模块。必须单独重新加载模块的(myfile)导入。此外,任何引用模块中任何内容的对象(如模块中定义类的实例)将继续使用先前加载的值。