tee没有什么神奇的。它很聪明;-)在任何点,tee克隆传递给它的迭代器。这意味着克隆的迭代器将从的这一点生成由传入迭代器生成的值。但是他们不可能重现在调用tee之前产生的值。在
让我们用比你的例子简单得多的东西来说明:>>> it = iter(range(5))
>>> next(it)
0
0现在消失了-永远。tee()无法取回:
^{pr2}$
因此a推动it生成下一个值。缓存的就是这个值,这样其他克隆也可以复制它:>>> next(b)
1
为了得到这个结果,it没有被触碰-从内部缓存中检索了1。现在所有的it、a和{}都产生了1,1也永远消失了。在
我不知道这是否回答了你的问题:“tee()知道我想要什么吗?”似乎需要心灵感应;—)也就是说,我不知道你说的“有适当的缓存”是什么意思。如果您给出一个您希望的输入/输出行为的确切示例,这将非常有帮助。在
除此之外,Python文档提供了相当于tee()的Python代码,研究这些代码也许可以回答您的问题:def tee(iterable, n=2):
it = iter(iterable)
deques = [collections.deque() for i in range(n)]
def gen(mydeque):
while True:
if not mydeque: # when the local deque is empty
newval = next(it) # fetch a new value and
for d in deques: # load it to all the deques
d.append(newval)
yield mydeque.popleft()
return tuple(gen(d) for d in deques)
例如,您可以看到,关于迭代器内部状态的任何信息都没有被缓存—缓存的只是传入迭代器生成的值,从调用tee()开始。每个克隆都有它自己的deque(FIFO list)传入迭代器的值,这就是所有克隆知道的传入迭代器。所以对于你真正希望的事情来说,这可能太简单了。在