在StopIteration时自动从内存中移除生成器对象(Python)
我注意到,一旦生成器用完了,它的对象仍然会留在内存中。 我该怎么做才能让生成器对象在用完后自动从内存中移除呢?
2 个回答
1
这个操作是Python不支持的。
1
你可以试着做一个包装器生成器,确保在完成后它不会再引用内部生成器。下面的代码可能会做到这一点(完全没有测试过):
def strange(gen):
for thing in gen:
yield thing
一旦 gen
抛出 StopIteration
,这个 strange
生成器就会退出循环,然后返回 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
来删除它。