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

字典推导式中使用walrus operator避免重复计算触发NameError原因求助

报错根本原因

Python字典推导式的执行顺序是固定的,对于结构为 {键表达式: 值表达式 for 变量 in 可迭代对象 if 过滤表达式} 的推导式,执行优先级如下:

  • 第一步:遍历可迭代对象拿到当前迭代变量的值
  • 第二步:执行if后的过滤表达式,判断当前迭代项是否符合要求
  • 第三步:只有过滤通过的迭代项,才会执行前面的键、值表达式生成最终字典的键值对

你原来的写法里,mean变量是在值表达式中通过海象运算符赋值的,但是过滤表达式if mean > 65的执行时机早于值表达式,运行过滤逻辑时mean还没有被定义,因此直接抛出NameError。

正确实现(避免重复计算均值)

把海象运算符的赋值逻辑移到过滤表达式中即可,赋值后的mean可以直接在后续的值表达式中复用:

dic = {"A": [45,58,75], "B": [55,82,80,92], "C": [78,95,90], "D":[98,75]}
q = {x: mean for x in dic if (mean := sum(dic[x]) // len(dic[x])) > 65}

运行后得到的q和你之前重复计算均值的写法结果完全一致,且整个推导过程中每个列表的均值只会计算一次。

补充说明

你第二次写的可运行代码中,迭代结束后可以直接访问到mean变量,是Python 3.11及更早版本的特性:推导式内部通过海象运算符赋值的变量会泄露到外层作用域,最后一次迭代赋值的结果会被保留。在Python 3.12+版本中该问题已经被修复,推导式内部的海象赋值变量不会再泄露到外层,迭代结束后访问mean会抛出NameError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:27:04