【问题标题】:Python: Delete Objects and Free Up SpacePython:删除对象并释放空间
【发布时间】:2018-08-10 11:20:03
【问题描述】:

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

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

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

然而,困扰我的是:

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

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

【问题讨论】:

  • 它不会在你的硬盘上——当你关闭 python 时它就消失了。
  • 如果你删除了两个引用,为什么引用计数仍然是 1?
  • 当你删除 ObjectX 时它会下降一个。当你删除 ListY 时它会下降另一个。
  • 因为我必须处理的数据量非常大。我担心在程序运行完成之前会发生内存泄漏。
  • 你永远不会打电话给__del__,当计数变为零时会为你调用。如果愿意,您可以调用 del,但只需退出分配 ObjectX 和 ListY 的方法就足以将引用计数减为零,因此(通常)您不需要调用 del

标签: python python-2.7 object reference destructor


【解决方案1】:

想象一个简单的类:

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?

不,它会降为零。

而该对象仍然留在硬盘中等待某个善良的灵魂来杀死它?

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

【讨论】:

  • 我知道析构函数现在是如何工作的。谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
相关资源
最近更新 更多