如何在Python中删除对象的每个引用?

问题描述 投票:7回答:3

假设你有类似的东西:

x = "something"
b = x
l = [b]

如何删除只有一个引用的对象,比如x?

del x不会这样做;例如,仍然可以从b访问该对象。

python reference garbage-collection weak-references del
3个回答
13
投票

不不不。 Python有一个垃圾收集器,它具有非常强大的区域问题 - 它不会弄乱你创建对象,你不会乱用它删除对象。

简单地说,它是不可能的,并且有充分的理由。

例如,如果您的需求来自于保留引用的缓存算法,但是一旦没有人使用它就不应该阻止数据被垃圾收集,您可能需要查看weakref


8
投票

我现在看到的唯一解决方案是你应该确保你持有x的唯一引用,其他人不能得到x本身但是指向x的弱引用。在weakref模块中实现了弱引用,您可以这样使用它:

>>> import weakref
>>> class TestClass(object):
...     def bark(self):
...         print "woof!"
...     def __del__(self):
...         print "destructor called"
...
>>> x = TestClass()
>>> b = weakref.proxy(x)
>>> b
<weakproxy at 0x7fa44dbddd08; to TestClass at 0x7fa44f9093d0>
>>> b.bark()
woof!
>>> del x
destructor called
>>> b.bark()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ReferenceError: weakly-referenced object no longer exists

但请注意,并非所有类都可以弱引用。特别是,大多数内置类型都不能。如果你对它们进行子类化(如dict),某些内置类型可能是弱引用的,但其他类型不能(如int)。


6
投票

你没有。这就是重点。想象一下,如果l在你控制范围之外的库中。它完全有权期望收集元素不会消失。

另外,想象一下,否则。你在这里有关于“如何阻止他人删除我的对象?”的问题。作为语言设计师,您无法满足这两种要求。

© www.soinside.com 2019 - 2024. All rights reserved.