Python对象没有引用者但仍可通过弱引用访问?

4 投票
5 回答
2499 浏览
提问于 2025-04-15 12:54

gc.get_referrers(obj) 这个函数有可能返回一个空列表,说明没有其他对象在引用这个对象,但这个对象仍然可以通过弱引用访问到,这种情况是否可能呢?

如果可能的话,我该怎么开始查找这个对象为什么没有被垃圾回收的原因呢?

补充说明:我不太确定代码示例在这种情况下能有什么帮助——显然某个地方还有一个强引用,但我就是找不到。我原以为所有对这个对象的强引用都会被 get_referrers() 找到。

补充说明:问题解决了。我找到了那个强引用的变量——它在游戏事件循环里面,但不是一个类变量,所以 get_referrers 没有找到它。

5 个回答

1

我很高兴你找到了你的问题,虽然和最开始的问题无关。不过,我想分享一些不同的看法,以便将来有其他人遇到类似问题时能参考。

对象可以没有任何引用,但仍然不会被垃圾回收,这是合法的。

根据Python 2.7的手册:“实现可以推迟垃圾回收,甚至完全不进行垃圾回收——垃圾回收的实现质量取决于具体的实现,只要没有被回收的对象仍然可以被访问。”

所以,完全不进行垃圾回收的情况是合法的。

关于代际垃圾回收和引用计数垃圾回收的讨论,是指特定的CPython实现(在问题中已经标明)。

1

也有可能是因为一个有问题的C扩展导致了引用泄漏。在我看来,你可能看不到引用的来源,但引用计数却没有降到0。你可以检查一下sys.getrefcount的返回值。

1

是的:http://docs.python.org/library/weakref.html

弱引用不会让对象一直存在。

get_referrers()这个函数只会找到那些支持垃圾回收的容器;如果是一些扩展类型,它们虽然引用了其他对象,但不支持垃圾回收的话,就找不到了。

你为什么觉得这个对象没有被回收呢?另外,你试过用gc.collect()吗?

撰写回答