Python 中的 zip 耗尽迭代器
Exhaustion of iterator by zip in Python
出于好奇我想问一下,为什么 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]
两个示例不应该打印相同的结果吗?谢谢。
zip
迭代器的 next()
将尝试按顺序读取其每个参数迭代器的下一个元素。如果其中任何一个报告它已耗尽,zip
迭代器将停止并报告它已耗尽。
这意味着它将对所有比最短参数长的初始参数执行额外的迭代。这意味着它读取了 c
.
的一个额外元素
您可以在 documentation 中的等效代码中看到此排序和额外迭代。
将c
更改为[1, 2, 3, 4, 5]
,最后会得到[5]
。
出于好奇我想问一下,为什么 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]
两个示例不应该打印相同的结果吗?谢谢。
zip
迭代器的 next()
将尝试按顺序读取其每个参数迭代器的下一个元素。如果其中任何一个报告它已耗尽,zip
迭代器将停止并报告它已耗尽。
这意味着它将对所有比最短参数长的初始参数执行额外的迭代。这意味着它读取了 c
.
您可以在 documentation 中的等效代码中看到此排序和额外迭代。
将c
更改为[1, 2, 3, 4, 5]
,最后会得到[5]
。