Списки vs генераторы: момент вычисления в Python

Списки vs генераторы: момент вычисления в Python

@python_quiz

Разберем этот квиз

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

Условие (код)

python

Что печатает код и почему

При выполнении:

  • 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, а он этого не делает.

Немного экспериментов

Можно быстро убедиться, что генератор — одноразовый и ленивый:

python

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

python

Выводы и полезные правила

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

Эти тонкости часто приводят к неожиданным результатам в реальном коде, особенно при асинхронной или отложенной обработке данных.

Report Page