2 回答
TA贡献1777条经验 获得超10个赞
从文档中:
如果提供的话,局部变量可以是任何映射对象。请记住,在模块级别,全局变量和局部变量是相同的字典。如果 exec 获取两个单独的对象作为全局对象和局部对象,则代码将像嵌入在类定义中一样执行。
并且类定义不会创建封闭范围,请注意,这就是为什么您不能在不使用 的情况下从另一个方法调用方法self
。所以只要把字典传过去就可以了globals()
。或者将两个相同的字典传递给两个参数。
In [4]: def run_code():
...: code = """
...: def foo():
...: print('foo')
...: return 1
...:
...: def bar():
...: print('bar calls foo')
...: return 1 + foo()
...:
...: result = bar()
...: """
...: namespace = {}
...: exec(code, namespace)
...: print('Result: {}'.format(namespace['result']))
...:
In [5]: run_code()
bar calls foo
foo
Result: 2
TA贡献1798条经验 获得超7个赞
code = """
def foo():
print('foo')
return 1
def bar():
global foo;
print('bar calls foo')
return 1 + foo()
result = bar()
"""
def run_code():
exec(code, globals(), locals())
print('Result: {}'.format(locals()['result']))
run_code()
输出:
bar calls foo
foo
Result: 2
添加回答
举报