在后面《Python 代码动静执行初探》中讲到过如何用 exec 和 eval 函数动静执行代码,也形容了如何限度其命名空间,防止动静代码造成环境“净化”。
不过,有的时候,咱们确实想要让动静代码生成一些部分或全局的定义——比方一个变量名——让原始代码或者前面的动静代码能够持续应用。像上面这样间接定义是无奈失效的:
def f():
a = 1
exec("a = 3")
print(a)
此时打印的后果会是 1,也就是说 exec 中对 a 的批改被抛弃了。不过能够采纳 locals 参数来取回批改:
def foo():
ldict = {}
exec("a=3",globals(),ldict)
a = ldict['a']
print(a)
这里的打印后果就是 3 了。
本文的示例代码取自 stack overflow 的一篇问答