Python中的zip耗尽迭代器[重复]

Posted

技术标签:

【中文标题】Python中的zip耗尽迭代器[重复]【英文标题】:Exhaustion of iterator by zip in Python [duplicate] 【发布时间】:2021-09-13 18:49:53 【问题描述】:

只是出于好奇,我想问一下,为什么 Python 中会出现以下通缉行为?

假设我们有:

a = [1,2,3]
b = [1,2,3]
c = [1,2,3,4]
ai = iter(a)
bi = iter(b)
ci = iter(c)

现在,我希望下面的示例打印 [4],但是,它打印了 []

for _ in zip(ci, zip(ai, bi)):
    pass

print(list(ci))

控制台:

>>> print(list(ci))
[]

但是当我更改外部 zip 的参数时,它会打印出我所期望的 ([4])。

for _ in zip(zip(ai, bi), ci):
    pass

print(list(ci))

控制台:

>>> print(list(ci))
[4]

两个示例不应该打印相同的结果吗?谢谢。

【问题讨论】:

【参考方案1】:

next()zip 迭代器将尝试按顺序读取其每个参数迭代器的下一个元素。如果其中任何一个报告它已耗尽,zip 迭代器将停止并报告它已耗尽。

这意味着它将对所有比最短参数长的初始参数执行额外的迭代。这意味着它读取了一个额外的元素c

您可以在documentation 的等效代码中看到这种排序和额外的迭代。

c 更改为[1, 2, 3, 4, 5],最后你会得到[5]

【讨论】:

当然,就是这么琐碎。非常感谢您指出这一点!

以上是关于Python中的zip耗尽迭代器[重复]的主要内容,如果未能解决你的问题,请参考以下文章

迭代器与生成器

Python | 迭代器与zip的一些细节

Python中的迭代器生成器

Python 3 中的迭代器

Python 迭代器协议以及可迭代对象迭代器对象

Python中的zip()与*zip()函数详解