使用内联for循环打印元组列表,为何输出包含[None, None, None]?
为什么列表推导式里用print会输出
[None, None, None]? 咱们先把问题场景再理一遍:你有个包含元组的列表:
my_list = [('a', 1), ('b', 2), ('c', 3)]
然后试着用列表推导式(也就是你说的内联for循环)来打印元素:
[print(i) for i in my_list]
结果输出里多了一行[None, None, None],这事儿其实得从两个核心点说起:
print()函数的返回值是Noneprint()的作用只是把内容输出到控制台,它本身不会返回任何有效数据——每次调用它,都会返回None。列表推导式的本质是创建新列表
列表推导式的核心目的是生成一个新列表,它会把循环中每一次迭代的表达式结果收集起来。在这里,你的表达式是print(i):- 每一次循环,
print(i)会执行,所以你能看到三个元组被打印出来; - 同时,
print(i)返回的None会被添加到推导式生成的新列表里。
- 每一次循环,
当你在交互式环境(比如Python命令行、Jupyter Notebook)里执行这个推导式时,Python会自动把这个刚生成的、全是None的列表输出到控制台,这就是最后那行[None, None, None]的由来。
正确的做法
如果只是想遍历列表打印元素,完全没必要用列表推导式,直接用普通for循环就好:
for i in my_list: print(i)
这样只会输出三个元组,不会出现多余的None列表。
要是你非得用类似推导式的写法(其实真没必要),可以换成生成器表达式——生成器不会自动把结果输出:
(print(i) for i in my_list)
不过这个生成器得被迭代才会执行print,比如用list()包裹,但那样又会回到原来的问题,所以还是老老实实用普通for循环最靠谱。
内容的提问来源于stack exchange,提问作者ptphdev
相关产品推荐
相关产品推荐

