使用此测试代码exec
(使用 Python 3.4):
vals = {}
exec('def fun(): print("Hello from fun")', vals)
exec('def main(): fun()', vals)
vals['main']()
输出是:
你好来自乐趣
但我没想到这会起作用,因为我假设它fun
和main
where 被解释为单独的代码片段,没有公共命名空间来解析main
对fun
.
那么如何执行main
解决对 的引用fun
?
基于加法的理解问题。使用for和print
,很明显这两个函数看到相同的全局变量:id
vals
globals
vals = {}
print('id(vals):', id(vals))
exec('def fun(): print("fun id(globals()):", id(globals())); print("Hello from fun")', vals)
exec('def main(): print("main id(globals()):", id(globals())); fun()', vals)
vals['main']()
这使:
编号(vals):32271016
主ID(全局()):32271016
有趣的 id(globals()): 32271016
你好来自乐趣
因此vals
用作 中代码的全局变量exec
,从而提供连接,如@Dunes 和其他评论所述。谢谢。