Python:删除对象并释放空间

5
Python文档称,如果对象的引用计数为零,则认为该对象已被删除。而del__del__之间的区别在于:
  • del将对象的引用计数减少1
  • __del__在对象的引用计数为零时执行
这意味着,如果我们不断删除对对象的引用,直到引用计数为零。它会执行__del__以删除对象以释放内存。
然而,令我困扰的是:
  • 如果我创建一个对象并将对象绑定到名称ObjectX。它会增加1个引用计数,对吧?

  • 如果我创建一个名为ListY的列表,并将ObjectX附加到ListY中。这意味着引用计数将增加到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

1
它不会存在于你的硬盘上 - 当你关闭Python时,它就会消失。 - doctorlove
1
如果您删除了两个引用,为什么引用计数仍然是1? - khelwood
当您删除ObjectX时,它会减少一个。当您删除ListY时,它会再减少一个。 - doctorlove
啊 - 好的 - 你能加上你的类定义吗?这样我们就有东西可以复现了。 - doctorlove
1
你不需要调用 __del__ 方法,当引用计数归零时,它会自动被调用。如果你愿意,可以调用 del 方法,但是只要退出分配 ObjectX 和 ListY 的方法即可将引用计数减少到零,所以通常不需要调用 del 方法。 - user9423368
显示剩余4条评论
1个回答

9

设想一个简单的类:

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吗?
不,它会降为零。
对象仍然留在硬盘中等待某些善良的人来杀死它吗?
不,它只存在于内存中,并且将被删除并释放内存。

我现在对析构函数的工作原理有了想法。感谢您的解释。 - Daozui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接