Python 重新加载模块是否会更改先前导入/重新加载的模块中的名称?
我有一个名为Python 重新加载模块是否会更改先前导入/重新加载的模块中的名称?,python,Python,我有一个名为myfile.py的模块 //myfile.py msg = 'Hello World' 然后我导入它:importmyfile 然后我做了一些修改,例如: //myfile.py (updated) a = 'Some text' b = 'Some other text' 然后调用重载函数: from imp import reload reload(myfile) 现在当我运行时:dir(myfile) 它显示当前模
myfile.py的模块
//myfile.py
msg = 'Hello World'
然后我导入它:importmyfile
然后我做了一些修改,例如:
//myfile.py (updated)
a = 'Some text'
b = 'Some other text'
然后调用重载函数:
from imp import reload
reload(myfile)
现在当我运行时:dir(myfile)
它显示当前模块重新加载以及以前模块(所有其他以前的导入/重新加载)的名称
这是否意味着在导入/重新加载模块时,“所有”名称(甚至更新后省略的名称)可单独用于外部世界
重新加载模块时,其字典(包含模块的全局变量)将被保留。名称的重新定义将覆盖旧的定义,因此这通常不是问题。如果新版本的模块未定义旧版本定义的名称,旧定义仍保留
模块在重新加载前未擦除。模块的新代码在所有旧变量绑定仍然存在的情况下执行。新代码定义的任何名称都将替换旧绑定,但新版本未定义的任何名称都将保留其旧值 Use可以使用Python的内置函数。从文档中:
执行重新加载(模块)时:
- 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
,并添加a
和b
变量(不退出当前的Python REPL)
//myfile.py-已更新
a=‘一些文本’
b=‘其他一些文本’
def x():
打印“%s:%s%”(a,b)
//从同一个python会话运行
>>>重新加载(myfile)
>>>myfile.x()
一些文本:一些其他文本
如果您已经使用外部编辑器编辑了模块源文件,并且希望在不离开Python解释器的情况下试用新版本,那么这将非常有用
最后一点注意:reload(myfile)
仅重新加载指定的模块。必须单独重新加载模块的(myfile)导入。此外,任何引用模块中任何内容的对象(例如,其类在模块中定义的实例)都将继续使用以前加载的值。我想知道为什么文档没有写入docstring中,以便我们只需键入help(imp.reload)
?
// 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