2024-06-17 13:22:04 发布
网友
有什么方法可以确保当一个对象被删除时,它会从它所在的位置完全删除?在
例如,如果你做了类似的事情:
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。在
List1
List2
有什么方法可以实现类似的行为?在
不,你是deleting a name,不是真正的对象。当只删除一个名称时,没有任何原因或机制导致对象被销毁(以及删除其他名称)。在
别想这么做,反正行不通。在你的程序结构中,当不再需要对象时,它们会自动被删除。在
也许你想释放一些你的对象使用的外部资源。不要为此使用对象删除(__del__不是解构器!)-请使用上下文管理器协议(也称为with语句)。我真的想不出任何其他的理由来尝试这个。。。在
__del__
with
在某些情况下可以使用weak references。如果您不在乎C在List2中是否仍然有效,可以将其包装在weakref中,当对{}的引用从List1过期时,垃圾回收器将收集与它相关联的所有内存。在
C
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。在
WeakValueDictionary
不,你是deleting a name,不是真正的对象。当只删除一个名称时,没有任何原因或机制导致对象被销毁(以及删除其他名称)。在
别想这么做,反正行不通。在你的程序结构中,当不再需要对象时,它们会自动被删除。在
也许你想释放一些你的对象使用的外部资源。不要为此使用对象删除(
__del__
不是解构器!)-请使用上下文管理器协议(也称为with
语句)。我真的想不出任何其他的理由来尝试这个。。。在在某些情况下可以使用weak references。如果您不在乎}的引用从List1过期时,垃圾回收器将收集与它相关联的所有内存。在
C
在List2
中是否仍然有效,可以将其包装在weakref中,当对{Python使用引用计数来决定是否应该收集一个对象,因此只要引用保存在某个地方,就不能完全删除该对象。但是,如果weakref包装了一个对象,则不计算该引用。所以当计数下降到0时,它将在GC方便的地方被收集。在
不过,请务必完整阅读文档,因为有很多与weakrefs相关的注意事项。尤其是那些有资格在weakref中使用的对象类型。在
编辑:
一个例子-
我强烈建议阅读有关weakrefs的全部文档。听起来你想建立一个节点结构,但是可以从管理器中引用这个节点结构。您可以将节点创建为常规对象,但将weakrefs放在管理器中的这些对象上。这样,当一个节点被移除时,管理器中的引用就会消失。在
一个候选对象是weakref模块中定义的
WeakValueDictionary
。在相关问题 更多 >
编程相关推荐