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

Python列表推导式读取locals()出现KeyError但普通循环正常问题问询

差异原因核心是Python3中列表推导式的独立作用域设计

1. 列表推导式的执行逻辑拆解

你写的列表推导式local_names = [locals()[name] for name in locals().keys()]实际执行顺序是:

  • 第一步:先计算in关键字后的可迭代对象,也就是locals().keys(),这一步是在外层代码的作用域执行的,拿到的是外层作用域所有的变量名(包括__name__等内置变量)
  • 第二步:进入列表推导式的独立局部作用域开始迭代,每一轮迭代时执行locals()[name],这里的locals()拿到的是列表推导式自己的局部命名空间,里面只有当前迭代的循环变量name,根本没有外层的__name__等变量,所以用外层拿到的name值去推导式内部的locals里查,自然会抛出KeyError。

2. 普通for循环无异常的原因

普通for循环没有独立的局部作用域,整个循环逻辑都在当前外层作用域执行:

  • 遍历locals()的时候拿到的是外层作用域的变量名
  • 每次循环调用locals()也都是读取外层作用域的命名空间,里面自然存在对应的变量名,所以不会报错。

兼容写法参考

如果需要用列表推导式实现需求,可以提前把外层的locals绑定到变量,避免在推导式内部调用locals:

outer_locals = locals().copy()
local_names = [outer_locals[name] for name in outer_locals.keys()]

内容的提问来源于stack exchange,提问作者W-S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:24:01