2014-12-07 32 views
1

我知道reload()功能可以在不影响from <module> import <name>" which were used before the重装()',但我测试了一下,发现一个奇怪的现象:如何解释使用“从X导入Y”导入一个函数Y在X文件中使用变量?

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

我想知道为什么打印机()看到change.I将再次编辑该问题。谢谢 – ztelur 2014-12-07 03:14:34

回答

3

重新加载更新现有模块。从一个模块的功能包含对模块全局的引用:

>>> printer.__globals__ is test1.__dict__ 
True 
>>> 'message' in printer.__globals__ 
True 
>>> printer.__globals__['message'] is test1.message 
True 

正是通过这一基准,像message全局都解决了。由于reload()函数更新了现有的模块名称空间,所以函数对象将使用新值。

reload()和从模块导入的名称(而不是对模块本身的引用)的问题是这些引用不会更新。如果您已更改printer()函数本身的定义而不是message全局,则对该函数的导入引用不会发生更改。

reload() function documentation引用:

当一个模块被重载,其字典(包含模块的全局变量)被保留。名称的重新定义将覆盖旧的定义,所以这通常不是问题。

强调我的

+0

是重装不能影响导入使用“from ** import”的函数,但函数包含对“ sys.modules“。重新加载后,sys.modules会更改,所以引用更改? – ztelur 2014-12-07 03:23:41

+0

@ztelur:no,'sys.modules ['test1']'*不会改变*。模块对象就地更新。 – 2014-12-07 03:24:38

相关问题