
Python 的 weakref 模块提供弱引用机制,核心作用是:**不增加对象的引用计数,从而避免循环引用导致的对象无法被及时回收**。
防止循环引用导致内存泄漏
当两个对象互相持有对方的强引用(比如 A 持有 B,B 也持有 A),即使外部已无其他引用指向它们,Python 的垃圾回收器(尤其是基于引用计数的主机制)也无法释放它们,造成内存泄漏。弱引用打破了这种“双向强依赖”:
- A 用
weakref.ref(B)持有 B 的弱引用 → 不会让 B 的引用计数 +1 - B 正常持有 A 的强引用 → 引用计数正常变化
- 一旦 A 被销毁,B 就可能被回收;B 被回收后,A 中的弱引用自动变为
None(调用时返回None)
缓存场景中避免长期驻留内存
比如实现一个基于对象 ID 或内容的缓存,但又不想让缓存本身阻止对象被回收:
本文档主要讲述的是Python开发网站指南;HTML是网络的通用语言,一种简单、通用的全置标记语言。它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器 Python和其他程序语言一样,有自身的一套流程控制语句,而且这些语句的语法和其它程序语言类似,都有for, if ,while 类的关键字来表达程序流程。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 用
weakref.WeakKeyDictionary:键是弱引用,若某个键对象被回收,对应条目自动从字典中清除 - 用
weakref.WeakValueDictionary:值是弱引用,若某个值对象被回收,该键值对自动消失 - 典型应用:缓存大型数据结构、GUI 组件映射、ORM 实例管理等
监听对象生命周期(配合回调)
通过 weakref.ref(obj, callback) 可为对象注册一个回调函数,当对象被垃圾回收时自动触发:
立即学习“Python免费学习笔记(深入)”;
- callback 接收一个参数:被回收对象的弱引用(此时已失效)
- 适合做资源清理、日志记录、调试追踪等无需强持有对象的轻量通知
- 注意:回调执行时机取决于 GC,不保证立即发生,也不适用于需要精确控制释放顺序的场景
常见弱引用类型与使用注意
除原始的 weakref.ref,标准库还封装了更易用的容器:
-
weakref.WeakSet:元素都是弱引用,对象被回收后自动剔除 -
weakref.finalize(obj, func):比 ref + callback 更简洁的终结器接口 - 不能对不可哈希或不可弱引用的对象使用(如 int、str、tuple 等内置不可变类型默认不支持弱引用;类需显式启用,或继承自支持弱引用的父类)
- 弱引用对象调用前必须先调用它(像函数一样),例如
wr() or None,否则得到的是weakref对象本身,不是目标对象









