Python:删除对象和释放空间

时间:2018-03-02 09:03:09

标签: python python-2.7 object reference destructor

Python文档说如果对象的引用计数为零,并且 del __ del __ 之间的差异为:

,则认为对象被删除
  • del 将对象的引用计数减少一个
  • __ del __ 在对象的引用计数为零时执行

这意味着如果我们继续删除对象的引用,直到引用计数为零。它会执行 __ del __ 来删除对象以释放内存。

然而,困扰我的是:

  • 如果我创建一个对象并将该对象绑定到名称 ObjectX 。它 将引用计数增加1,对吗?

  • 如果我创建一个名为 ListY 的列表,并附加 ListY 使用 ObjectX 。这意味着它会增加引用计数 到2,对吗?

  • 现在,如果我删除 ObjectX ListY ,引用计数是否会 对象仍然保持为1并且对象仍然存在 坐在硬盘里等待某种灵魂来杀死它?

欢迎任何评论和想法....

顺便说一下,如果发生的事情真的是我对Python中删除对象的理解。对于如何删除附加到列表中的对象并释放内存空间有什么好的建议吗?

class Slave:

def __init__(self):
    self.name=""

def __del__(self):
    print("SLAVE DEAD")

def sequence():

   SlaveX=Slave()
   slaveList=list()
   slaveList.append(SlaveX)

del SlaveX
   print("I AM NOT DEAD YET")
   del slaveList

1 个答案:

答案 0 :(得分:4)

想象一个简单的课程:

class Thingy:
    pass

现在我可以创建这个类的对象并将其命名为george

george = Thingy()

现在我已经创建了一个类的实例,并且我有一个对它的引用。在某个地方,这个计数被维持并设置为1。

我可以创建一个名为mary的新变量,并将其分配给同一个对象:

mary = george

现在我仍然只有一个对象,但我有两个对象。如果我在george上调用方法,则会影响mary引用的对象,因为它是同一个实例。

在您提及列表时,我们也可以将其添加到列表中,但实际上它完全相同,它会将引用计数增加到3。

my_objects = []
my_objects.append(george)

现在有三个参考。现在,仍然在这个方法中,让我们再次删除引用

george = None    # reference count drops to 2
mary = 3         # reference count drops to 1
my_objects.pop() # reference count drops to 0

当计数降为0时,python运行时会实现这一点(可能不是直接,但足够快)并在实例上调用__del__方法。你不关心这个,你只是让引用消失。

  

现在,如果我删除ObjectX和ListY,对象的引用计数是否仍然保持为1?

不,它会降到零。

  

并且物体仍然坐在硬盘中等待某种灵魂来杀死它?

不,它只在内存中保存,将被删除,内存又被释放。