Skip to main content
 首页 » 编程设计

python之从内存中删除类实例

2025年05月04日15oomusou

在我的程序中,我创建了无穷无尽的类实例。数量取决于程序运行的时间。但是,在运行某个代码后,我根本不需要这些实例。我怎样才能将它们从内存中完全删除?

简单示例代码:

class Player: 
    def __init__(self, color): 
        self.color = color 
 
for n in range(1000): 
    p = Player('black') 

del p 在这种情况下会完全删除该实例吗?

请您参考如下方法:

当它们不再被引用时,Python 会为您从内存中删除它们。如果您有引用其他 Player 实例的 Player 实例(例如:p.teammates = [list of Players]),您最终可能会得到可能会阻止它们被垃圾收集的循环引用。在这种情况下,您应该考虑 weakref模块。

例如:

>>>sam = Player('blue') 
>>>rob = Player('green') 
>>>sam.team = [sam, rob] 
>>>rob.team = [sam, rob] 
>>> #sam and rob may not be deleted because they contain  
>>> #references to eachother so the reference count cannot reach 0 
>>>del sam #del is a way to manually dereference an object in an interactive prompt. Otherwise the interpreter cannot know you won't use it again unlike when the entire code is known at the beginning. 
>>>print(rob.team[0].color) #this prints 'blue' proving that sam hasn't been deleted yet 
blue 

那么我们该如何解决呢?

>>>sam = Player('blue') 
>>>rob = Player('green') 
>>>sam.team = [weakref.ref(sam), weakref.ref(rob)] 
>>>rob.team = [weakref.ref(sam), weakref.ref(rob)] 
>>> #now sam and rob can be deleted, but we've changed the contents of `p.team` a bit: 
>>> #if they both still exist: 
>>>rob.team[0]() is sam #calling a `ref` object returns the object it refers to if it still exists 
True 
>>>del sam 
>>>rob.team[0]() #calling a `ref` object that has been deleted returns `None` 
None 
>>>rob.team[0]().color #sam no longer exists so we can't get his color 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'color'