如何在Python中删除对象的每个引用?

时间:2010-06-10 09:48:28

标签: python reference garbage-collection weak-references del

让你有类似的东西:

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

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

del x不会这样做;例如,仍然可以从b访问该对象。

4 个答案:

答案 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]