首页 > 后端开发 > Python教程 > Python 3 中的 exec() 是否会更新局部变量?如果没有,该如何实现?

Python 3 中的 exec() 是否会更新局部变量?如果没有,该如何实现?

Linda Hamilton
发布: 2024-12-12 21:55:10
原创
406 人浏览过

Does `exec()` Update Local Variables in Python 3, and If Not, How Can It Be Made To?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板