exec 对局部变量的影响:深入了解
exec 函数是动态代码执行的 Python 主打函数,它提出了一个有趣的查询:它可以更新函数内的局部变量吗?
Python 3困境
在 Python 3 中,以下代码片段无法像人们预期的那样更新局部变量:
def f(): a = 1 exec("a = 3") print(a)
它令人震惊地打印出 ',而不是预期的 '3'。 1'!
Python 2行为
奇怪的是,Python 2 中的相同代码确实会更新局部变量,打印“3”。这种差异源于 Python 处理局部变量方式的根本性变化。
局部困境
与 Python 2 不同,Python 3 将局部变量存储在优化的冻结数组中在编译时。这种效率是以禁止运行时修改局部变量为代价的。因此,Python 3 中默认的 exec 调用无法成功更改局部变量。
The Magic of Locals()
要绕过此限制并更新局部变量,必须显式传递本地字典给 exec。该字典将在执行动态代码后存储更新的局部变量。修改后的代码如下所示:
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
Exec() 的含义
Python 3 文档明确警告不要在使用 exec 时修改默认的 locals() 字典,因为这可能会导致不可预测的行为。为了安全起见,当打算更新局部变量时,应该总是传递一个显式的局部字典给 exec。
Python 的奇妙优化
Georg Brandl 对 Python 的深刻评论bug 报告强调,Python 3 对局部变量的优化导致了当前的行为。编译器无法区分自定义 exec 函数和 Python 自己的函数,因此无法为它们提供特殊待遇。因此,默认的 exec 不能改变局部变量。
Python 2 的异常
在 Python 2 中,旧的 exec 语句的工作方式不同。它允许借助编译器对内置 exec 的特殊处理来动态修改局部变量。
结论
Python 3 中的 exec 调用需要一个微妙的修改局部变量的方法发生变化。通过使用显式本地字典,开发人员可以利用动态代码执行的强大功能,同时保持对本地变量的控制。
以上是Python 3 中的 exec() 是否会更新局部变量?如果没有,该如何实现?的详细内容。更多信息请关注PHP中文网其他相关文章!