В следующем примере показано различное поведение в зависимости от того, является ли самый правый генератор в понимании списка списком или итератором. В частности, при использовании итератора генерируется меньшее количество результатов. Я считаю, что это поведение очень удивительно.Элементы отсутствуют, когда итератор используется в понимании списка
Я новичок в Python, поэтому, я думаю, что мне не хватает чего-то очевидного, но я был бы благодарен за объяснение.
>>> import itertools
>>> xs = range(0, 5)
>>> ys = range(0, 3)
>>> zs_l = [x for x in xs if not x in ys]
>>> zs_l
[3, 4]
# Validate the contents of the iterator, and create it again
>>> zs_i = itertools.ifilterfalse(lambda x: x in ys, xs)
>>> list(zs_i)
[3, 4]
>>> list(zs_i)
[]
>>> zs_i = itertools.ifilterfalse(lambda x: x in ys, xs)
>>> [(i,z) for i in [1,2] for z in zs_l]
[(1, 3), (1, 4), (2, 3), (2, 4)]
>>> [(i,z) for i in [1,2] for z in zs_i]
[(1, 3), (1, 4)]