Будет ли генератор Python собирать мусор, если он больше не будет использоваться, но еще не достиг StopIteration?

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

import weakref
import gc

def countdown(n):
    while n:
        yield n
        n-=1

cd = countdown(10)
cdw = weakref.ref(cd)()
print cd.next()
gc.collect()
print cd.next()
gc.collect()
print cdw.next()

Во второй последней строке я вызвал сборщик мусора, и, посколькуcd большеgc должен освободитьcd право. Но когда я звонюcdw.next(), он все еще печатает 8. Я попробовал еще несколькоcdw.next(), он может успешно распечатать все остальное до StopIteration.

Я попробовал это, потому что хотел понять, как работают генератор и сопрограмма. На слайде 28 Дэвида Бизлис PyCon презентация "Любопытный курс о сопрограммах и параллелизме »Он сказал, что сопрограмма может работать бесконечно, и мы должны использовать.close() чтобы закрыть его. Тогда он сказал, что сборщик мусора позвонит.close(), В моем понимании, однажды мы позвонили.close() мы сами,gc позвоню.close() снова. Будетgc получить предупреждение, что он можетт звонок.close() на уже закрытой сопрограмме?

Спасибо за любые вклады.

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

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