Странное поведение итератора Python [дубликат]

На этот вопрос уже есть ответ здесь:

Локальные переменные во вложенных функциях 3 ответа

Я играл с генераторами Python иitertools модуль и попытался сделать бесконечную версию сита Эратосфена. Вот мой код:

from itertools import count, ifilter, islice

def sieve_broken():
    candidates = count(start=2)
    while True:
        prime = next(candidates)
        yield prime
        candidates = ifilter(lambda n: n % prime, candidates)

Когда я проверяю это, я получаю это:

>>> print list(islice(sieve_broken(), 10))
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

Но если я заменю переназначениеcandidates с такой функцией:

def sieve_fixed():
    def exclude_multiples(factor, numbers):
        return ifilter(lambda n: n % factor, numbers)

    candidates = count(start=2)
    while True:
        prime = next(candidates)
        yield prime
        candidates = exclude_multiples(prime, candidates)

Я получил:

>>> print list(islice(sieve_fixed(), 10))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

Я не могу понять, почему первая версия не работает. Насколько я могу судить, две версии должны быть эквивалентны. Кто-нибудь знает, почему они не одинаковы?

Ответы на вопрос(0)

Ваш ответ на вопрос