如何解释使用"来自X import Y"导入一个在X文件中使用变量的函数Y?

时间:2014-12-07 03:07:29

标签: python python-module

我知道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()会看到变化呢?我认为原因可能是变量绑定。

1 个答案:

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

  

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

强调我的