You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自由变量名解析疑问:与官方文档描述的矛盾求解

关于Python文档中eval/exec与动态特性交互的疑问解答

首先明确文档描述的适用场景:

4.2.6. 与动态特性的交互
eval()和exec()函数无法访问完整的命名解析环境,名称可在调用者的本地和全局命名空间中解析。自由变量不会在最近的封闭命名空间中解析,而是在全局命名空间中解析。

你的测试代码和文档描述的场景完全不同,不存在矛盾:

  • 你的代码是闭包的常规调用:f1作为闭包,在定义时就已经捕获了外层f0作用域中的var = 'local',执行f()时自然会输出'local',这是Python闭包的基本行为,和文档中提到的eval/exec规则无关。
  • 文档的规则仅针对使用eval()或exec()执行代码片段时的自由变量解析逻辑,举个符合文档场景的示例:
var = 'global'

def f0():
    var = 'local'
    def f1():
        # 用eval执行引用var的代码,触发文档中描述的规则
        eval('print(var)')
    return f1

def ftest(f):
    var = 'ftest'
    f()

ftest(f0())

在Python 3.12中运行这段代码,会输出global——因为eval()内部的var作为自由变量,并没有去最近的f0封闭作用域查找,而是直接使用了全局命名空间中的值,这完全符合文档的描述。

总结:文档的规则只约束eval()和exec()的行为,普通闭包的变量捕获逻辑不受此规则影响,所以你的测试结果和文档描述没有冲突。

内容的提问来源于stack exchange,提问作者Pingas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:40:01