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

Python 3.11.9中bar函数exec执行后locals无result的原因咨询

问题原因分析

在Python中,函数的局部变量是编译阶段确定的,而非运行阶段。这就是foo和bar函数返回结果不同的核心原因:

  • foo函数:函数体内没有任何地方显式定义result变量,exec语句在运行时动态创建的result会被添加到局部命名空间中,所以locals()能捕获到它。
  • bar函数:虽然result = 100位于return语句之后,属于永远不会执行的不可达代码,但Python在编译函数时会扫描整个函数体的变量定义,将result标记为该函数的局部变量。此时exec里对result的赋值无法修改这个预定义的局部变量绑定,因此locals()中不会包含exec创建的result。

你可以通过一个简单的验证来确认这一点:在bar函数中尝试直接打印result,会抛出UnboundLocalError,说明Python已经将result识别为局部变量,但它从未被实际赋值:

def bar():
    exec('a = 10; b = 5; result = a * b')
    print(result)  # 报错:UnboundLocalError: local variable 'result' referenced before assignment
    return locals()
    result = 100
解决方法

如果想要bar函数返回的locals()包含exec创建的result,只需删除函数体中那个不可达的result = 100定义即可,让Python不会在编译阶段将result标记为局部变量。修改后的bar函数如下:

def bar():
    exec('a = 10; b = 5; result = a * b')
    return locals()

此时执行print(bar())就会得到和foo函数相同的结果:{'a': 10, 'b': 5, 'result': 50}。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:21:04