15

假设你有类似的东西:

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

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

del x不会成功的;例如,该对象仍然可以从 b 到达。

4

3 回答 3

18

不不不。Python 有一个垃圾收集器,它有非常严重的领域问题——它不会干扰你创建对象,也不会干扰它删除对象。

简而言之,这是不可能的,而且是有充分理由的。

例如,如果您的需求来自例如缓存算法的情况,该算法保留引用,但不应阻止数据在没有人使用时被垃圾收集,您可能需要查看weakref.

于 2010-06-10T11:44:15.070 回答
12

我现在看到的唯一解决方案是你应该确保持有唯一的引用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)。

于 2010-06-10T12:54:48.347 回答
5

你没有。这就是重点。想象一下,如果l在您无法控制的库中。它完全有权利期望收藏元素不会消失。

另外,想象一下如果不是这样。您在这里有关于“如何防止其他人删除我的对象?”的问题。作为语言设计师,你不能同时满足这两个需求。

于 2010-06-10T11:40:01.160 回答