有没有办法确保删除某个对象时,它会从何处完全删除?
例如,如果你做了类似的事情:
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。
有没有办法可以实现与此相似的行为?
答案 0 :(得分:4)
在某些情况下,您可以使用weak references。如果您不关心C
中List2
是否仍然存在,则可以将其包装在weakref中,当对C
的引用从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的整个文档。听起来您想要构建节点结构,但能够从Manager引用该节点结构。您可以将节点创建为常规对象,但将weakrefs放置在Manager中的那些对象上。这样,当删除一个节点时,Manager中的引用就会死掉。
这个候选者将是weakref模块中定义的WeakValueDictionary
。
答案 1 :(得分:2)
没有。你是deleting a name,而不是实际的对象。当只删除一个名称时,没有理由或机制导致对象被销毁(以及其他名称被删除)。
答案 2 :(得分:1)
不要试图这样做,否则无论如何都行不通。以一种方式构建程序,使对象在不再需要时自动删除。
也许您想要释放对象使用的一些外部资源。不要使用对象删除(__del__
不是解构函数!) - 使用上下文管理器协议(又称with
语句)。我真的想不出任何其他理由来尝试这个......