在此代码中,Foo()
个类的对象在创建新对象后仍然是活动的.我猜原因在于追加对象的List属性上的循环引用.那么,如何让垃圾回收器释放旧对象,而不需要手动调用gc.collect()
呢?
import gc
class Foo():
def __init__(self):
self.functions = []
print('CREATE', self)
def some_func(self):
for i in range(3):
self.functions.append(self.print_func)
print(self.functions)
def print_func(self):
print('I\'m a test')
def __del__(self):
print('DELETE', self)
foo = Foo()
foo.some_func()
foo = Foo()
# gc.collect()
input = input()
最后的input()
只是为了保持程序运行.有此问题的实际项目包含While循环,因此保留旧的未使用的对象可能会导致内存泄漏.
现在,输出:
CREATE <__main__.Foo object at 0x000002747001D850>
[<bound method Foo.print_func of <__main__.Foo object at 0x000002747001D850>>, <bound method Foo.print_func of <__main__.Foo object at 0x000002747001D850>>, <bound method Foo.print_func of <__main__.Foo object at 0x000002747001D850>>]
CREATE <__main__.Foo object at 0x000002746FD0BB90>
呼叫gc.collect()
时的输出:
CREATE <__main__.Foo object at 0x0000021E45F0D8E0>
[<bound method Foo.print_func of <__main__.Foo object at 0x0000021E45F0D8E0>>, <bound method Foo.print_func of <__main__.Foo object at 0x0000021E45F0D8E0>>, <bound method Foo.print_func of <__main__.Foo object at 0x0000021E45F0D8E0>>]
CREATE <__main__.Foo object at 0x0000021E45CDBB90>
DELETE <__main__.Foo object at 0x0000021E45F0D8E0>
这是一个结果,我想要得到,但不用gc