Czy generator Pythona zostanie usunięty, jeśli nie będzie już używany, ale nie osiągnął jeszcze StopIteration?

Kiedy generator nie jest już używany, powinien zostać pobrany śmieci, prawda? Próbowałem następującego kodu, ale nie jestem pewien, która część była błędna.

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()

W drugiej ostatniej linii zadzwoniłem do garbage collectora, a ponieważ nie ma żadnego połączeniacd więcej.gc powinien być wolnycd dobrze. Ale kiedy dzwonięcdw.next(), nadal drukuje 8. Spróbowałem jeszcze kilkucdw.next(), może z powodzeniem wydrukować całą resztę do StopIteration.

Próbowałem tego, ponieważ chciałem zrozumieć, jak działają generatory i korynty. Na slajdzie 28 prezentacji PyCon Davida Beazleya „Ciekawy kurs o Coroutines i współbieżności”, powiedział, że kortyna może działać bezterminowo i powinniśmy użyć.close() aby go wyłączyć. Potem powiedział, że zbieracz śmieci zadzwoni.close(). W moim rozumieniu, gdy zadzwoniliśmy.close() my sami,gc zadzwonię.close() jeszcze raz. Będziegc otrzymać ostrzeżenie, że nie może zadzwonić.close() na już zamkniętym korpusie?

Dzięki za wszelkie dane wejściowe.

questionAnswers(4)

yourAnswerToTheQuestion