Вопрос проверяет понимание различий между генераторами и списками, а также поведения бесконечных последовательностей.
List comprehension создаёт список целиком в памяти. Если генератор бесконечный, построение списка никогда не завершится. В итоге программа будет либо работать бесконечно, либо упадёт по нехватке памяти. Поэтому бесконечные генераторы используют только в потоковой обработке или с ограничением количества элементов.
List comprehension стремится получить все элементы сразу.
Определение: List comprehension — синтаксис, который создаёт список, полностью вычисляя все элементы.
Если генератор бесконечный:
def infinite():
i = 0
while True:
yield i
i += 1
# list comprehension
lst = [x for x in infinite()] # никогда не завершится
Процесс будет:
Python начнёт запрашивать элементы генератора.
Генератор будет возвращать значения бесконечно.
Список будет расти, занимая всё больше памяти.
В конечном итоге возможна ошибка MemoryError.
Обычно используют ограничение:
from itertools import islice
lst = list(islice(infinite(), 10))
Или оставляют генератор генератором:
gen = (x for x in infinite())
# обработка по одному элементу
Бесконечные генераторы хорошо подходят для потоковой обработки, но не для создания списков.
Использование бесконечного генератора в list comprehension приведёт к бесконечному выполнению или переполнению памяти, потому что список пытается собрать все элементы.