根据我的理解,
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)], []
根据 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], []