有什么办法可以保证当一个对象被删除时,它无论在什么地方都被完全删除?
例如,如果你做了类似的事情:
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。
