Я использую генераторы в списках и получаю неожиданное поведение, когда один из генераторов заканчивается рано.Почему создание генератора вне понимания списка приводит к изменению поведения?
Генератор, который я создал, выглядит следующим образом:
def inc_range(a,b):
for i in range(min(a,b), max(a,b) + 1):
yield i
Первый способ вызова выглядит следующим образом:
[(i,j) for i in inc_range(1,3) for j in inc_range(4,6)]
Это дает мне следующий результат:
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
Второй способ его вызова следующий:
a = inc_range(1,3)
b = inc_range(4,6)
[(i,j) for i in a for j in b]
Это дает мне следующее:
[(1, 4), (1, 5), (1, 6)]
Экспериментируя, следующие два примера дали мне первый результат:
a = range(1,4)
b = range(4,7)
[(i,j) for i in a for j in b]
a = (i for i in range(1,4))
b = (i for i in range(4,7))
a = list(a)
b = list(b)
[(i,j) for i in a for j in b]
В то время как следующее снова дало мне второй результат.
a = (i for i in range(1,4))
b = (i for i in range(4,7))
[(i,j) for i in a for j in b]
Какое правило я нарушаю здесь относительно генераторов?Почему это имеет значение, когда я назначаю генераторы переменным перед их использованием в понимании списка, а не использую их напрямую?
ОТВЕТЫ
Проверьте следующееответы, которые помогли мне понять, что происходит здесь:
Алекс Ю mkrieger1