在停止迭代时自动从内存中删除生成器对象(Python)

在停止迭代时自动从内存中删除生成器对象(Python),python,memory-management,generator,Python,Memory Management,Generator,我注意到,一旦发电机耗尽,该对象仍保留在内存中如何使生成器对象在耗尽后自动从内存中删除?这不是Python支持的操作。您可以尝试制作包装生成器,确保完成后它没有对内部生成器的引用。以下内容甚至可以做到这一点(完全未经测试): 一旦gen引发StopIteration,奇怪的生成器将退出for循环,然后返回None,这将再次引发StopIteration。如果gen是对生成器的最后一个引用,那么在任何代码迭代奇怪(gen)获得控制权之前,它应该/可能可以被垃圾收集。在CPython上,这意味着它被

我注意到,一旦发电机耗尽,该对象仍保留在内存中如何使生成器对象在耗尽后自动从内存中删除?

这不是Python支持的操作。

您可以尝试制作包装生成器,确保完成后它没有对内部生成器的引用。以下内容甚至可以做到这一点(完全未经测试):

一旦
gen
引发
StopIteration
奇怪的
生成器将退出for循环,然后返回
None
,这将再次引发
StopIteration
。如果
gen
是对生成器的最后一个引用,那么在任何代码迭代
奇怪(gen)
获得控制权之前,它应该/可能可以被垃圾收集。在CPython上,这意味着它被释放了

请注意,如果您执行以下操作,这将没有帮助:

g = some_generator()
for x in strange(g):
    do_something()
因为
g
本身是对内部生成器的引用。您必须更像这样使用它:

for x in strange(some_generator()):
    do_something()

但实际上,最简单的方法是在不希望任何其他对象在内存中挂起时对其执行操作:确保没有保留对它的引用。如果引用它的变量在一个长期有效的范围内,您可以显式地
del
它。

如果您只有一个引用,只需
del generator
@agf:请将您的答案作为答案发布,以便我们可以正确地向上投票。“我注意到,一旦一个生成器耗尽,该对象仍保留在内存中”。你是怎么注意到的?请提供代码。可能是您通过创建对对象的另一个引用而造成了自己的问题。
for x in strange(some_generator()):
    do_something()