Skip to main content
 首页 » 编程设计

python之python中的总对象删除

2025年05月04日14linjiqin

有什么办法可以保证当一个对象被删除时,它无论在什么地方都被完全删除?

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

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。

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

请您参考如下方法:

您可以使用 weak references在某些情况下。如果你不关心 C 是否在 List2 中仍然存在,你可以将它包装在一个 weakref 中,当对 C 的引用从List1,垃圾收集器将收集与其关联的所有内存。

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

不过请务必完整阅读文档,因为有很多与弱引用相关的注意事项。尤其是可以在 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 放置在管理器中的这些对象中。这样,当一个节点被删除时,Manager 中的引用就会消失。

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