如何无法直接使用 exec 更新局部变量
Python 中的 exec 调用是动态执行代码的强大工具,但是它对局部变量的修改有限制。
考虑以下内容code:
def f(): a = 1 exec("a = 3") print(a) f()
人们可能期望这段代码打印 3,但它实际上打印 1。这是因为在 Python 3 中,局部变量不是存储在字典中,而是存储在编译时确定索引的数组中时间。 exec 函数无法在不干扰此优化的情况下安全地修改局部变量。
解决方案:使用 Local Dictionary 与 exec
要使用 exec 修改局部变量,您需要显式传递本地字典。例如:
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
这会执行本地字典 (ldict) 中的代码,这与函数的本地变量数组不同。然后可以通过访问本地字典将修改后的变量返回到函数的作用域。
Python 2 行为
在 Python 2 中,exec 可以修改局部变量而无需传递显式字典,因为它将使用不带全局/本地参数的 exec 的命名空间视为“未优化”。然而,Python 3 中并非如此。
因此,请务必记住,在使用 exec 时,只能通过创建和传递本地字典来更新局部变量,以避免与编译器的优化发生任何潜在冲突.
以上是为什么 Python 3 中的 exec 不能直接更新局部变量?的详细内容。更多信息请关注PHP中文网其他相关文章!