Python:删除对象并释放空间

Dao*_*zui 4 python destructor reference object python-2.7

Python 文档说,如果对象的引用计数为零,则认为该对象已删除,并且del__del__之间的区别在于:

  • del将对象的引用计数减一
  • __del__在对象的引用计数为零时执行

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

然而,让我烦恼的是:

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

  • 如果我创建一个名为列表ListY和我追加ListY目标x。这意味着它将引用计数增加到 2,对吗?

  • 现在,如果我删除ObjectXListY,对象的引用计数是否仍然保持为 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
Run Code Online (Sandbox Code Playgroud)

小智 9

想象一个简单的类:

class Thingy:
    pass
Run Code Online (Sandbox Code Playgroud)

现在我可以创建这个类的一个对象并调用它george

george = Thingy()
Run Code Online (Sandbox Code Playgroud)

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

我可以调用一个新变量mary并将其分配给同一个对象:

mary = george
Run Code Online (Sandbox Code Playgroud)

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

正如您提到的列表,让我们也将其添加到列表中,但本质上它完全相同,它将引用计数增加到 3。

my_objects = []
my_objects.append(george)
Run Code Online (Sandbox Code Playgroud)

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

george = None    # reference count drops to 2
mary = 3         # reference count drops to 1
my_objects.pop() # reference count drops to 0
Run Code Online (Sandbox Code Playgroud)

当计数下降到 0 时,python 运行时意识到这一点(可能不是立即,但足够快)并__del__在实例上调用该方法。你不在乎这个,你只是让引用消失。

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

不,它会降为零。

对象还留在硬盘里等着某种灵魂来杀死它?

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