Python中两次打印len(list(nums))结果不同的原因?
问题:Python中连续两次执行
print(len(list(nums)))输出2和0的原因是什么? 代码示例:
nums = {1,2,3,4,5,6} nums = {0,1,2,3} & nums print(nums) nums=filter(lambda x: x > 1, nums) print(nums) print(len(list(nums))) print(len(list(nums)))
运行输出:
{1, 2, 3} <filter object at 0x000001FDFECD2850> 2 0
原因解析:
核心问题出在filter对象是一次性迭代器:
- 执行
nums=filter(lambda x: x > 1, nums)后,nums不再是集合,而是一个filter迭代器。这类迭代器不会提前计算并存储所有结果,只有在被遍历的时候才会逐个生成符合条件的元素(这里是2和3)。 - 第一次调用
list(nums)时,会完整遍历这个迭代器,把所有元素取出组成列表,此时迭代器内部的指针已经走到末尾,没有剩余元素了。 - 第二次调用
list(nums)时,迭代器已经被耗尽,无法再生成任何元素,因此得到空列表,长度为0。
如果想要多次使用过滤后的结果,可以提前把迭代器转成列表保存:
nums = list(filter(lambda x: x > 1, nums))
这样后续无论多少次调用len(nums),结果都会是2。
内容的提问来源于stack exchange,提问作者begintolearn
相关产品推荐
相关产品推荐

