Python实际上并没有将外部作用域的本地复制到内部作用域的本地;locals
状态文档:
当在功能块中调用免费变量时,它是由locals()返回的,而在类块中则没有。
这里的“自由”变量是指由嵌套函数封闭的变量。这是一个重要的区别。
您的情况,最简单的解决方法是只传递 同一个 字典对象globals
和locals
:
code = """
myvar = 300
def func():
return myvar
func()
"""
d = {}
eval(compile(code, "<str>", "exec"), d, d)
否则,您可以将代码包装在一个函数中,然后从编译的对象中提取出来:
s = 'def outer():\n ' + '\n '.join(code.strip().split('\n'))
exec(compile(s, '<str>', 'exec').co_consts[0], {}, {})