Python文档说如果对象的引用计数为零,并且del和__del__之间的差异是:
这意味着如果我们继续删除对象的引用,直到引用计数为零。它将执行__del__删除对象以释放内存。
然而,令我不安的是:
欢迎任何评论和想法....
顺便说一句,如果发生的事情真的是我在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
想象一个简单的类:
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?
不,它会降到零。
并且物体仍然坐在硬盘中等待某种灵魂来杀死它?
不,它只在内存中保存,将被删除并再次释放内存。