如何在Python中删除对象的所有引用?

20 投票
3 回答
30172 浏览
提问于 2025-04-15 23:48

假设你有这样的东西:

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

那么你怎么才能只通过一个引用,比如 x,来删除这个对象呢?

del x 这个命令是没用的;因为这个对象仍然可以通过 b 访问到。

3 个回答

4

你不能这样做。这就是问题的关键。想象一下,如果l是在一个你无法控制的库里,它有理由相信里面的元素不会消失。

再想象一下如果情况正好相反。你会在StackOverflow上看到有人问“我该怎么防止别人删除我的对象?”作为一个语言设计者,你无法同时满足这两种需求。

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)就不行。

21

不不不。Python有一个垃圾回收机制,它在管理内存方面非常严格——你可以放心地创建对象,但不要干扰它删除对象。

简单来说,这种事情是做不到的,而且有很好的理由。

举个例子,如果你遇到的情况是像缓存算法那样需要保持引用,但又不想让数据在没人使用时被垃圾回收机制清除,那么你可以看看weakref

撰写回答