有人可以解释一下itertools中`zip`和`tee`之间的交互吗?

问题描述 投票:0回答:1

根据我的理解,

tee
应该制作迭代器的独立副本,每个副本都可以单独耗尽。然而,当耗尽 teed 副本时,有时原始迭代器是完整的,而在其他时候(例如,当涉及
zip
时),它反而被耗尽。为什么会发生这种情况?我是否遗漏了
tee
zip
语义上的一些细微差别?

range(3)
的预期行为。原始迭代器完好无损,可以单独穷举。

a = range(3)
a1,a2 = tee(a,2)
print(list(a1), list(a2), list(a))
>> [0, 1, 2], [0, 1, 2], [0, 1, 2]

zip(range(3),range(3,6))
的意外行为。当副本耗尽时,原始迭代器也耗尽。

a = zip(range(3),range(3,6))
a1,a2 = tee(a,2)
print(list(a1), list(a2), list(a))
>> [(0, 3), (1,4), (2,5) ], [(0, 3), (1, 4), (2,5)], []
python python-itertools tee python-zip
1个回答
0
投票

根据 Michael Butcher 的评论,

range(3)
是一个可迭代对象,而
iter(range(3))
是一个迭代器,其行为类似于
zip(...)

a = iter(range(3))
a1,a2 = tee(a,2)
print(list(a1),list(a2),list(a)
>> [0, 1, 2], [0, 1, 2], []
© www.soinside.com 2019 - 2024. All rights reserved.