Python:删除对象并释放 Space
Python: Delete Objects and Free Up Space
Python 文档说,如果对象的引用计数为零且 del 和 [= 之间的差异,则该对象被视为已删除65=] 是:
- del 减少一个对象的引用计数
- __del__ 当对象的引用计数为零时执行
这意味着如果我们一直删除对对象的引用,直到引用计数为零。它会执行 __del__ 删除对象以释放内存。
然而,令我困扰的是:
如果我创建一个对象并将该对象绑定到名称ObjectX。它
会将引用计数增加 1,对吗?
如果我创建一个名称为 ListY 的列表,然后附加 ListY
ObjectX。这意味着它会增加引用计数
到 2 对吧?
现在,如果我删除 ObjectX 和 ListY,引用计数会
对象仍然保持为 1 并且对象仍然存在
坐在硬盘里等着好心人来杀死它?
欢迎任何意见和想法....
顺便说一句,如果发生的事情真的是我对 Python 中删除对象的理解。关于如何删除附加到列表中的对象并释放内存 space 有什么好的建议吗?
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:
class Thingy:
pass
现在我可以创建这个 class 的对象并将其命名为 george
:
george = Thingy()
现在我已经创建了 class 的一个实例并且我有一个对它的引用。这个计数在某处被维护并设置为 1。
我可以创建一个名为 mary
的新变量并将其分配给同一个对象:
mary = george
现在我仍然只有一个对象,但我有两个对它的引用。如果我在 george
上调用方法,这会影响 mary
引用的对象,因为它是同一个实例。
正如你提到的列表,让我们也将它添加到列表中,但本质上它完全相同,它将引用计数增加到 3。
my_objects = []
my_objects.append(george)
现在有3个参考。现在,仍然在这个方法中,让我们再次删除引用
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__
方法。你不关心这个,你只是让引用消失。
Now, if I delete ObjectX and ListY, would the reference count to the object still remain as 1?
不,它会降为零。
and the object is still remaining sitting there in hard disk waiting for some kind soul to come and kill it?
不,它只是保留在内存中,将被删除并再次释放内存。
Python 文档说,如果对象的引用计数为零且 del 和 [= 之间的差异,则该对象被视为已删除65=] 是:
- del 减少一个对象的引用计数
- __del__ 当对象的引用计数为零时执行
这意味着如果我们一直删除对对象的引用,直到引用计数为零。它会执行 __del__ 删除对象以释放内存。
然而,令我困扰的是:
如果我创建一个对象并将该对象绑定到名称ObjectX。它 会将引用计数增加 1,对吗?
如果我创建一个名称为 ListY 的列表,然后附加 ListY ObjectX。这意味着它会增加引用计数 到 2 对吧?
现在,如果我删除 ObjectX 和 ListY,引用计数会 对象仍然保持为 1 并且对象仍然存在 坐在硬盘里等着好心人来杀死它?
欢迎任何意见和想法....
顺便说一句,如果发生的事情真的是我对 Python 中删除对象的理解。关于如何删除附加到列表中的对象并释放内存 space 有什么好的建议吗?
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:
class Thingy:
pass
现在我可以创建这个 class 的对象并将其命名为 george
:
george = Thingy()
现在我已经创建了 class 的一个实例并且我有一个对它的引用。这个计数在某处被维护并设置为 1。
我可以创建一个名为 mary
的新变量并将其分配给同一个对象:
mary = george
现在我仍然只有一个对象,但我有两个对它的引用。如果我在 george
上调用方法,这会影响 mary
引用的对象,因为它是同一个实例。
正如你提到的列表,让我们也将它添加到列表中,但本质上它完全相同,它将引用计数增加到 3。
my_objects = []
my_objects.append(george)
现在有3个参考。现在,仍然在这个方法中,让我们再次删除引用
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__
方法。你不关心这个,你只是让引用消失。
Now, if I delete ObjectX and ListY, would the reference count to the object still remain as 1?
不,它会降为零。
and the object is still remaining sitting there in hard disk waiting for some kind soul to come and kill it?
不,它只是保留在内存中,将被删除并再次释放内存。