让你有类似的东西:
x = "something"
b = x
l = [b]
如何删除只有一个引用的对象,比如x?
del x
不会这样做;例如,仍然可以从b访问该对象。
答案 0 :(得分:13)
不不不。 Python有一个垃圾收集器,它具有非常强大的区域问题 - 它不会弄乱你创建对象,你不会乱用它删除对象。
简单地说,这是不可能完成的,并且有充分的理由。
例如,如果您需要来自缓存引用的缓存算法,但不应该阻止数据在没有人使用时进行垃圾收集,那么您可能需要查看{{3 }}
答案 1 :(得分:8)
我现在看到的唯一解决方案是,您应确保您持有x
的唯一引用,其他人必须不获取{ {1}}本身,但是指向x
的弱引用。弱引用在weakref
模块中实现,您可以这样使用它:
x
但请注意,并非所有类都可以弱引用。特别是,大多数内置类型都不能。如果你对它们进行子类化(如>>> 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
)。
答案 2 :(得分:6)
你没有。这就是重点。想象一下,l
是否在您控制之外的库中。它完全有权期望收集元素不会消失。
另外,想象一下,如果不是这样的话。你在这里有关于“如何阻止他人删除我的对象?”的问题。作为语言设计师,您无法满足这两种要求。
答案 3 :(得分:0)
我不认为此问题的其他答案完全可以理解所要问的内容。我认为OP并未询问如何执行垃圾收集器的角色。似乎他们在问您是否可以一次删除所有引用,而又不知道它们在哪里。
想象一下,您有一个社交媒体网站。用户具有朋友,组,页面等。当某人删除其帐户时,您要删除其对等对象的朋友列表中对该帐户的引用。您还希望删除它们所在的组中的引用,等等。不幸的是,除非您为每个引用都使用weakref.proxy然后删除原始引用,否则我认为没有办法做到这一点,但这似乎比只是找到何时需要删除它们。
您只需要跟踪对您对象的引用,因此对于我们假装的社交媒体网站:
def delete_user(user):
for friend in user.friends.values():
del friend.friends[self.id]
for group in user.groups.values():
del group.members[self.id]
del users.all[self.id]