python中的完全对象删除

2024-06-17 13:22:04 发布

您现在位置:Python中文网/ 问答频道 /正文

有什么方法可以确保当一个对象被删除时,它会从它所在的位置完全删除?在

例如,如果你做了类似的事情:

A = NewObject()
B = NewObject()
C = NewObject()

List1 = [A,B,C]
List2 = [1,2,3,C]

del A
del List2[3]

并在任何地方删除对象,这意味着List1只包含B,List2只包含1,2,3。在

有什么方法可以实现类似的行为?在


Tags: 对象方法地方事情dellist2list1newobject
3条回答

不,你是deleting a name,不是真正的对象。当只删除一个名称时,没有任何原因或机制导致对象被销毁(以及删除其他名称)。在

别想这么做,反正行不通。在你的程序结构中,当不再需要对象时,它们会自动被删除。在

也许你想释放一些你的对象使用的外部资源。不要为此使用对象删除(__del__不是解构器!)-请使用上下文管理器协议(也称为with语句)。我真的想不出任何其他的理由来尝试这个。。。在

在某些情况下可以使用weak references。如果您不在乎CList2中是否仍然有效,可以将其包装在weakref中,当对{}的引用从List1过期时,垃圾回收器将收集与它相关联的所有内存。在

Python使用引用计数来决定是否应该收集一个对象,因此只要引用保存在某个地方,就不能完全删除该对象。但是,如果weakref包装了一个对象,则不计算该引用。所以当计数下降到0时,它将在GC方便的地方被收集。在

不过,请务必完整阅读文档,因为有很多与weakrefs相关的注意事项。尤其是那些有资格在weakref中使用的对象类型。在

编辑:

一个例子-

>>> class List(list):
...     pass
... 
>>> weaklist = List()
>>> weaklist.append('a')
>>> weaklist.append('b')
>>> stronglist = [ ['c','d','e'] ]
>>> weaklist
['a', 'b']
>>> stronglist
[['c', 'd', 'e']]
>>> import weakref
>>> stronglist.append(weakref.ref(weaklist))
>>> stronglist
[['c', 'd', 'e'], <weakref at 0x10046e578; to 'List' at 0x100455f70>]
>>> stronglist[1]()
['a', 'b']
>>> del weaklist
>>> stronglist
[['c', 'd', 'e'], <weakref at 0x10046e578; dead>]
>>> stronglist[1]()
>>>

我强烈建议阅读有关weakrefs的全部文档。听起来你想建立一个节点结构,但是可以从管理器中引用这个节点结构。您可以将节点创建为常规对象,但将weakrefs放在管理器中的这些对象上。这样,当一个节点被移除时,管理器中的引用就会消失。在

一个候选对象是weakref模块中定义的WeakValueDictionary。在

相关问题 更多 >