如何在Python中删除对象的所有引用?
假设你有这样的东西:
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
。