Python中dict的key在for循环和列表推导式遍历结果差异问题
两种遍历方式的差异原因
核心差异来自print()函数的返回值规则、列表推导式的本质,以及Python交互环境(REPL)的输出特性:
- Python中
print()的作用仅为将内容输出到控制台,它的固定返回值是None,不会返回你打印的内容本身 - 列表推导式的本质是遍历可迭代对象,将每轮迭代的表达式执行结果收集起来,生成新列表
- 在Python交互环境中执行的表达式如果有返回值,环境会自动把返回值打印到控制台
普通for循环的执行逻辑
for ky in myDict.keys(): print(ky)是纯粹的遍历操作:
每轮迭代只会调用print(ky)把key输出到控制台,for循环本身没有返回值,也不会生成额外对象,所以你只会看到预期的6个key输出,没有其他多余内容。
列表推导式的执行逻辑
[print(ky) for ky in myDict.keys()]的执行分两个环节:
- 遍历过程中每轮都会调用
print(ky),所以控制台同样会输出6个key - 列表推导式会收集每轮
print(ky)的返回值,因为print每次返回None,最终会生成一个包含6个None的列表,这个列表作为整个列表推导式的返回值,会被Python交互环境自动打印出来,所以你会看到最后多了一段全None的列表输出。
注意事项
如果只是要遍历执行操作、不需要生成新的列表,不要使用列表推导式,它会额外占用内存生成无意义的None列表,普通for循环是更适配该场景的写法。
内容的提问来源于stack exchange,提问作者bhall
相关产品推荐
相关产品推荐

