5

list 和 islice 对象都是可迭代的,但为什么会出现这种差异。

r = [1, 2, 3, 4]               
i1, i2 = tee(r)
print [e for e in r if e < 3]
print [e for e in i2]
#[1, 2]
#[1, 2, 3, 4]


r = islice(count(), 1, 5)          
i1, i2 = tee(r)
print [e for e in r if e < 3]
print [e for e in i2]
#[1, 2]
#[]
4

2 回答 2

14

这里的问题是tee()需要使用原始迭代器中的值,如果您开始使用原始迭代器中的值,它将无法正常运行。在您的列表示例中,迭代只是再次开始。在生成器示例中,它已用尽,不再产生任何值。

这是有据可查的:

一旦 tee() 进行了拆分,则不应在其他任何地方使用原始的可迭代对象;否则,在不通知 tee 对象的情况下,iterable 可能会被推进。

来源

编辑以说明列表和生成器之间的区别点:

>>> from itertools import islice, count
>>> a = list(range(5))
>>> b = islice(count(), 0, 5)
>>> a
[0, 1, 2, 3, 4]
>>> b
<itertools.islice object at 0x7fabc95d0fc8>
>>> for item in a:
...     print(item)
... 
0
1
2
3
4
>>> for item in a:
...     print(item)
... 
0
1
2
3
4
>>> for item in b:
...     print(item)
... 
0
1
2
3
4
>>> for item in b:
...     print(item)
... 
>>> 
于 2012-06-12T14:47:00.487 回答
0

在您的列表推导中,您想替换ri1.

于 2012-06-12T15:23:51.923 回答