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

为何zip对象首次使用后无返回值?代码异常问题解析

为什么zip对象转集合后再迭代会得到空列表?

嘿,这个问题其实是Python里迭代器的一个经典“小坑”——迭代器是一次性的,我给你拆解得明明白白:

首先要明确:在Python 3中,zip()函数返回的不是一个列表,而是一个zip类型的迭代器对象。迭代器的核心特性就是它只能被完整遍历一次:每从里面取一个元素,它就会向前“移动”一步,直到所有元素都被取完,之后再尝试遍历它,就再也拿不到任何元素了。

咱们一步步拆解你的代码流程:

  1. b = zip(l1,l2) 创建了一个包含(0,0)、(1,1)...(9,9)这些元素的迭代器,但此时它还没被遍历过,所有元素都“待在”里面。
  2. c = set(b) 这一步是把迭代器b转换成集合。要生成集合,Python必须完整遍历一遍迭代器b,把里面所有元素都取出来放进集合里。这时候,迭代器b已经被“榨干”了——里面没有剩余元素了。
  3. 接下来执行result = [(x,y) for x,y in b],这时候再去遍历b,但它已经是空的了,自然生成的列表也是空的,所以len(result)输出0。

而当你注释掉c = set(b)和print(c)这两行时,迭代器b第一次被遍历是在生成result列表的时候,这时候它的所有元素都被正常取出来,所以能得到符合预期的结果。

举个更直观的小例子验证这个特性:

b = zip(range(2), range(2))
# 第一次遍历,取完所有元素
print(list(b))  # 输出 [(0, 0), (1, 1)]
# 第二次遍历,迭代器已耗尽,没有元素了
print(list(b))  # 输出 []

内容的提问来源于stack exchange,提问作者arash moradi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:58:14