在StopIteration时自动从内存中移除生成器对象(Python)

2 投票
2 回答
2344 浏览
提问于 2025-04-17 00:48

我注意到,一旦生成器用完了,它的对象仍然会留在内存中。 我该怎么做才能让生成器对象在用完后自动从内存中移除呢?

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 来删除它。

撰写回答