import gc closed = False def generator(iterable, held=None): global closed try: for chunk in iterable: yield chunk except GeneratorExit: print('generator exit') finally: print('held: %r' % held) print('closing') closed = True h = [] g = generator(range(5), h) h.append(g) del h for i in g: print('break: %r' % closed) break print('before del: %r' % closed) del g print('after del: %r' % closed) print('before gc.collect: %r' % closed) gc.collect() print('after gc.collect: %r' % closed)