Списки vs генераторы: момент вычисления в Python
@python_quizРазберем этот квиз
Коротко: в Python список, созданный через list comprehension, вычисляется сразу, а генератор — лениво и берёт элементы при итерации. Это ключ к пониманию вывода следующего фрагмента.
Условие (код)

Что печатает код и почему
При выполнении:
- lists — это новый список, в момент создания он содержит [1, 2, 3]. Позже добавление в data на lists не влияет.
- gen — генератор, он не материализует элементы сразу. Когда вызывается sum(gen), генератор начинает итерировать текущий объект data, поэтому видит уже добавленный 4.
Таким образом, вывод будет:

Первое число 6 = 1 + 2 + 3, второе число 10 = 1 + 2 + 3 + 4.
Почему другие варианты неверны
Рассмотрим остальные логичные варианты вывода:
- "6 6" — такое было бы, если бы генератор тоже «захватил» элементы сразу (например, если бы gen был списком). Но генератор ленивый, поэтому видит добавление.
- "10 10" — такое могло бы быть, если бы список lists ссылался на data напрямую (например,
lists = data), или если бы list comprehension выполнялся после append. Но list comprehension создает отдельный список актуального состояния data на момент выполнения. - "10 6" — невозможный порядок для данного кода: чтобы первое было 10, lists должен был включать 4, а он этого не делает.
Немного экспериментов
Можно быстро убедиться, что генератор — одноразовый и ленивый:

А вот пример, где и список, и "генератороподобное" поведение дают разные результаты:

Выводы и полезные правила
- List comprehension немедленно создаёт новый список — это снэпшот состояния на момент выполнения.
- Генераторное выражение лениво: элементы берутся при итерации и зависят от текущего состояния источника.
- Генераторы одноразовые: после полной итерации они исчерпаны.
- Если нужен «снимок» данных для дальнейших независимых операций — используйте список. Если важна ленивость и экономия памяти — используйте генератор, но помните об его одноразовости и зависимости от состояния источника.
Эти тонкости часто приводят к неожиданным результатам в реальном коде, особенно при асинхронной или отложенной обработке данных.