Python:删除对象和释放空间

问题描述 投票:1回答:1

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
python python-2.7 object reference destructor
1个回答
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?

不,它会降到零。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.