Python 3.3
Я построил эту слегка загадочную часть python 3.3:
>>> [(yield from (i, i + 1, i)) for i in range(5)]
<generator object <listcomp> at 0x0000008666D96900>
>>> list(_)
[0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 4, 3, 4, 5, 4]
Если я использую понимание генератора внутри конструктора списка, я получаю другой результат:
>>> list((yield from (i, i + 1, i)) for i in range(5))
[0, 1, 0, None, 1, 2, 1, None, 2, 3, 2, None, 3, 4, 3, None, 4, 5, 4, None]
Почему нет списка, возвращающего список?
Python 2.7
Я могу получить аналогичный нечетный эффект в python 2 (используя понимание набора, потому что в представлениях списков есть странная область):
>>> {(yield i) for i in range(5)}
<generator object <setcomp> at 0x0000000004A06120>
>>> list(_)
[0, 1, 2, 3, 4, {None}]
И при использовании понимания генератора:
>>> list((yield i) for i in range(5))
[0, None, 1, None, 2, None, 3, None, 4, None]
Откуда появился {None}
?