使用此测试代码exec(使用 Python 3.4):
vals = {}
exec('def fun(): print("Hello from fun")', vals)
exec('def main(): fun()', vals)
vals['main']()
输出是:
你好来自乐趣
但我没想到这会起作用,因为我假设它fun和mainwhere 被解释为单独的代码片段,没有公共命名空间来解析main对fun.
那么如何执行main解决对 的引用fun?
基于加法的理解问题。使用for和print,很明显这两个函数看到相同的全局变量:idvalsglobals
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 和其他评论所述。谢谢。