当没有传递全局字典时,exec创建的引用是否会变为无效?

时间:2013-10-09 16:05:22

标签: python

exec.py

def func1():
   pass
def required_func():
   func1()
from some_module import set_callback
set_callback(required_func)

main.py

execfile('exec.py',dict())
call_callback() #indirectly calls required_func

我执行文件为globals传递一个空的dict()。 required func会在[{1}}中保存一个引用,但some_module也可以调用吗?将func1删除,因为它不在func1中或保存在任何其他对象中吗?

1 个答案:

答案 0 :(得分:0)

它不会被删除,因为当您定义函数required_func时,它会引用其模块的globals

>>> d = dict()
>>> execfile('test.py', d)
>>> from some_module import f
>>> f
<function required_func at 0x7fb5649b5578>
>>> f.func_globals is d
True

如果不是这样,那么无论何时将函数导入另一个模块,该函数都将使用该模块的globals。这是你想要的东西。 命名空间冲突会有一个很大的问题,因此某些函数会根据导入的位置以不同的方式开始运行。