我知道reload()
函数不会影响from <module> import <name>" which were used before the
reload()`,但我测试了它并找到了奇怪的东西:
test1.py
:
message="before editing"
def printer():
print("reload",message)
test1.py
(已更改):
message="after editing"
def printer():
print("reload",message)
然后我使用了解释器并输入了:
from test1 import printer
printer()
import test1
test1.printer()
#change the test1.py
reload(test1)
test1.printer()
printer()
重新加载后,结果是:
>>> test1.printer()
('reload:', 'after editing')
>>> printer()
('reload:', 'after editing')
那么,为什么printer()
会看到变化呢?我认为原因可能是变量绑定。
答案 0 :(得分:3)
重新加载更新现有模块。模块中的函数包含对模块全局变量的引用:
>>> printer.__globals__ is test1.__dict__
True
>>> 'message' in printer.__globals__
True
>>> printer.__globals__['message'] is test1.message
True
通过此引用可以解析像message
这样的全局变量。由于reload()
函数更新了现有的模块命名空间,因此printer
函数对象将使用新值。
reload()
的问题和模块中的导入名称(而不是对模块本身的引用)是那些引用未更新。如果您更改了printer()
函数本身而不是message
全局的定义,那么导入的对该函数的引用不会发生更改。
引用reload()
function documentation:
重新加载模块时,保留其字典(包含模块的全局变量)。名称的重新定义将覆盖旧的定义,因此这通常不是问题。
强调我的。