假设你有如下内容:
x = "something"
b = x
l = [b]
如何删除只有一个引用(比如x)的对象?
del x
不能完成任务;例如,对象仍然可以从b中访问到。
假设你有如下内容:
x = "something"
b = x
l = [b]
如何删除只有一个引用(比如x)的对象?
del x
不能完成任务;例如,对象仍然可以从b中访问到。
不行。Python有一个垃圾回收器,它具有非常强的领土问题 - 它不会干扰您创建对象,您不能干扰它删除对象。
简单来说,这是不可能做到的,而且有很好的理由。
例如,如果您的需求来自于缓存算法等保留引用但不应阻止数据在无人使用时被垃圾回收的情况,您可以查看 weakref
。
我目前唯一看到的解决方案是,你应该确保你持有对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
)。
str
不能被弱引用,即使您子类化它也不行。弱引用字符串会打开巨大的问题;例如,Python解释器可能选择“内部化”字符串对象并将其保留在内存中,即使没有对它的引用,希望它以后可能有用。通常解释器会这样做来处理小字符串和整数,但是您也可以选择使用 intern
内置函数来内部化一个字符串(至少在 Python 2.x 中)。 - Tamásl
在你无法控制的库中,它有权利期望集合元素不会消失。
此外,想象一下如果情况相反,你会在 SO 上看到这样的问题:“如何防止其他人删除我的对象?” 作为语言设计者,你无法同时满足这两个需求。
a
在哪里? - John La Rooy__del__
方法覆盖为零,或者使用0xdeadbeef
)吗?还是您正在调试实际的竞争条件,在这种情况下,它们在被删除但尚未被GC回收之前实际上以某种方式被引用了(可能是线程问题)?或者其他原因? - smcix
不是“这个对象”,x
是该对象的名称(在您的术语中,是对它的引用)。b
也是如此。因此,它有两个名称,而对其中一个名称使用del
仍然会使其保留一个名称。 - Karl Knechtel