Вложение экземпляров одного и того же генератора в Python

Скажем, у меня есть генератор:

def mygen():
    for i in range(10):
        yield i

Это работает так, как я и ожидал: все комбинации i и j

for i in mygen():
    for j in mygen():
        print i, j

Я бы подумал, что это разные случаи. Почему они не действуют как разные инстанции?

g1 = mygen()
g2 = mygen()

for i in g1:
    for j in g2:
        print i, j

Если я попробую g1.next(), я получу ошибку, потому что данных не осталось.

Я использую Python 2.7.1.


person jtguerin    schedule 10.05.2012    source источник
comment
Первый фрагмент вызывает mygen 11 раз, а второй — только два раза. Сапиенти сел.   -  person georg    schedule 10.05.2012


Ответы (1)


Итерация по g2 в первый раз потребляет его, поэтому ничего не остается, когда вы пытаетесь выполнить итерацию по нему в последующие разы.

g1 = mygen()
for i in g1:
    g2 = mygen()
    for j in g2:
        print i, j
person Ignacio Vazquez-Abrams    schedule 10.05.2012
comment
Верно. Чтобы быть конкретным, в примере ОП, где он использует for j in mygen():, он создает новый генератор для каждого значения i. - person zigg; 10.05.2012
comment
Ааа, да. Думаю, это была какая-то глупая ошибка. Я уже некоторое время использую Python, но мыслить в терминах генераторов для меня все еще немного в новинку. Спасибо! - person jtguerin; 24.05.2012