2011-08-31 38 views
1

我注意到一旦生成器耗尽,对象仍保留在内存中。 如何让生成器对象在耗尽后自动从内存中移出?在StopIteration(Python)中自动从内存中删除生成器对象

+1

如果你只有一个引用它,只是'del generator'。 – agf

+0

@agf:请将您的答案发布为答案,以便我们可以正确地对其进行修改。 –

+1

“我注意到一旦发电机耗尽,物体仍留在内存中”。你是怎么看到这个的?请提供代码。这可能是因为您创建了另一个对象引用来创建自己的问题。 –

回答

1

你可以尝试制作一个包装器生成器,确保它一旦完成就没有对内部生成器的引用。以下甚至可能做到这一点(没有经过充分测试):

def strange(gen): 
    for thing in gen: 
     yield thing 

一旦gen提高StopIterationstrange发生器将退出for循环,然后返回None,这将再次提高StopIteration。如果gen是生成器的最后一个引用,它应该/可能可用于垃圾收集,然后无论代码是否在迭代strange(gen)获得控制权。在CPython上,这意味着它被释放。

请注意,如果你这样做了以下不会帮助:

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

因为g本身是内部产生的参考。你不得不使用它更像是这样的:

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

但实际上,最简单的方法,就是去做你与任何其他物体,当你不希望它挂在内存中做什么:确保你不会坚持引用它。如果引用它的变量处于长寿命范围内,则可以明确地del它。

1

这不是Python支持的操作。