Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的完全对象删除_Python_Class_Global - Fatal编程技术网

python中的完全对象删除

python中的完全对象删除,python,class,global,Python,Class,Global,是否有任何方法可以确保在删除对象时,它会从任何位置完全删除 例如,如果您执行了以下操作: 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 有什么方法可以实现类似的行为吗?没有。你不是真实的对象。只有一个名称被删除时,没有理由或机制导致对象被销毁(以及其他名称

是否有任何方法可以确保在删除对象时,它会从任何位置完全删除

例如,如果您执行了以下操作:

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


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

没有。你不是真实的对象。只有一个名称被删除时,没有理由或机制导致对象被销毁(以及其他名称被删除)。

不。你不是真正的对象。只有一个名称被删除时,没有理由或机制导致对象被销毁(以及其他名称被删除)。

不要尝试这样做,它无论如何都不会起作用。以这样一种方式组织您的程序:当不再需要对象时,对象会自动删除


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

不要尝试这样做,它无论如何都不会起作用。以这样一种方式组织您的程序:当不再需要对象时,对象会自动删除

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

在某些情况下可以使用。如果您不关心
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]()
>>>
>>类列表(列表):
...     通过
... 
>>>weaklist=List()
>>>weaklist.append('a')
>>>weaklist.append('b')
>>>strong列表=[['c'、'd'、'e']]
>>>弱者
['a','b']
>>>强项列表
[c',d',e']
>>>进口武器
>>>strong列表.追加(weakref.ref(weaklist))
>>>强项列表
[c',d',e',]
>>>strong列表[1]()
['a','b']
>>>德尔威克利斯特酒店
>>>强项列表
[c',d',e',]
>>>strong列表[1]()
>>>
我强烈建议阅读关于weakrefs的全部文档。听起来您想建立一个节点结构,但可以从管理器中引用该节点结构。您可以将节点创建为常规对象,但将weakrefs放置到管理器中的这些对象。这样,当删除节点时,管理器中的引用就消失了

这方面的一个候选者是weakref模块中定义的
WeakValueDictionary

在某些情况下可以使用。如果您不关心
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]()
>>>
>>类列表(列表):
...     通过
... 
>>>weaklist=List()
>>>weaklist.append('a')
>>>weaklist.append('b')
>>>strong列表=[['c'、'd'、'e']]
>>>弱者
['a','b']
>>>强项列表
[c',d',e']
>>>进口武器
>>>strong列表.追加(weakref.ref(weaklist))
>>>强项列表
[c',d',e',]
>>>strong列表[1]()
['a','b']
>>>德尔威克利斯特酒店
>>>强项列表
[c',d',e',]
>>>strong列表[1]()
>>>
我强烈建议阅读关于weakrefs的全部文档。听起来您想建立一个节点结构,但可以从管理器中引用该节点结构。您可以将节点创建为常规对象,但将weakrefs放置到管理器中的这些对象。这样,当删除节点时,管理器中的引用就消失了


weakref模块中定义的
WeakValueDictionary
是这方面的候选。

我知道它只删除了名称,这就是我问是否有任何方法可以实现功能的原因我知道它只删除了名称,这就是我问是否有任何方法可以实现功能的原因我尝试这样做的原因是,在我正在工作的程序中,我有一个节点系统,它由一个总体管理器类、一个节点类和一个链接类组成,我遇到的问题是,尝试删除链接时仍会在管理器和点对象等位置保留对链接的引用。我尝试这样做的原因是,在我正在处理的程序中,我有一个节点系统,该系统由一个总体管理器类、一个节点类和一个链接类组成,我遇到的问题是,尝试删除链接时仍会在诸如manager和point Object之类的位置留下对该链接的引用。这看起来是正确的