从内存中删除类实例 [英] Delete class instance from memory

查看:44
本文介绍了从内存中删除类实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的程序中,我创建了无休止的类实例.该数量取决于程序运行多长时间.但是,在运行某些代码之后,我根本不需要这些实例.我如何才能将它们从内存中完全删除?

In my program I create an un-ending amount of class instances. the amount depends on how long the program is running. However I don't need the instances at all after a certain code being run. How could i remove them completely from memory?

简单的示例代码:

class Player:
    def __init__(self, color):
        self.color = color

for n in range(1000):
    p = Player('black')

在这种情况下 del p 是否可以完全删除该实例?

Would del p in this case completely remove that instance?

推荐答案

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

Python will remove them from memory for you when they are no longer referred to. If you have Player instances that refer to other Player instances (ex: p.teammates = [list of Players]) you could end up with circular references that may prevent them from being garbage collected. In this case you should consider the weakref module.

例如:

>>>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

那么我们该如何解决呢?

so how do we fix it?

>>>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'

这篇关于从内存中删除类实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆