You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python弱引用回调未触发且未销毁:强引用销毁后为何异常?

问题解答

1. 回调函数未执行的原因

你创建的弱引用指向的是Foo.bar对应的函数对象,但这个对象被类Foo本身持有强引用(它是类的属性)。即使将method设为None,只是减少了一个强引用,类Foo仍然存在,函数对象的引用计数并未降到0,因此不会被垃圾回收,弱引用的回调也就不会触发。

2. 弱引用未被销毁的原因

核心原因和上面一致:Foo.bar对应的函数对象还被类Foo强引用着,对象本身没有被回收,所以指向它的弱引用wr仍然有效,不会被销毁。

验证方法

如果想让弱引用触发回调,可以移除类对该函数的强引用,再手动触发垃圾回收:

def is_dead(wr): 
    print("Callback function called!")

class Foo(object):
    def bar(self): pass
 
method = Foo.bar
wr = weakref.ref(method, is_dead)
# 删除类对bar方法的引用
del Foo.bar
method = None
# 手动触发垃圾回收
import gc
gc.collect()
print(wr())  # 输出None,说明弱引用已失效,回调已执行

内容的提问来源于stack exchange,提问作者20MikeMike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:15:57