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
相关产品推荐
相关产品推荐

