为何zip对象首次使用后无返回值?代码异常问题解析
为什么zip对象转集合后再迭代会得到空列表?
嘿,这个问题其实是Python里迭代器的一个经典“小坑”——迭代器是一次性的,我给你拆解得明明白白:
首先要明确:在Python 3中,zip()函数返回的不是一个列表,而是一个zip类型的迭代器对象。迭代器的核心特性就是它只能被完整遍历一次:每从里面取一个元素,它就会向前“移动”一步,直到所有元素都被取完,之后再尝试遍历它,就再也拿不到任何元素了。
咱们一步步拆解你的代码流程:
b = zip(l1,l2)创建了一个包含(0,0)、(1,1)...(9,9)这些元素的迭代器,但此时它还没被遍历过,所有元素都“待在”里面。c = set(b)这一步是把迭代器b转换成集合。要生成集合,Python必须完整遍历一遍迭代器b,把里面所有元素都取出来放进集合里。这时候,迭代器b已经被“榨干”了——里面没有剩余元素了。- 接下来执行
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
相关产品推荐
相关产品推荐

