编程学习网 > 编程语言 > Python > 什么是 Python 的 弱引用 (weakref)?
2025
09-15

什么是 Python 的 弱引用 (weakref)?


平时写 Python 程序,大家可能都习惯直接 new 一个对象,用完了就交给垃圾回收(GC)去管,对吧?但是有时候你会遇到一种情况:我想要“记住”某个对象,但又不想因为我保存了它,导致它永远不被回收,这时候就得用到弱引用(weakref)。

弱引用的意思其实很直白,就是“我知道你在那儿,但我不强行拉着你”。Python 默认的引用(比如直接赋值给变量、放进 list/dict)都会让对象的引用计数 +1,从而保证对象活着。而弱引用不增加这个计数,也就是说,当没有强引用时,即使还有弱引用指着它,对象还是会被 GC 干掉。

为什么需要弱引用?

举个常见的场景:做缓存。比如我写了个图片处理的小工具,加载过的图片对象我想放到一个字典里,下次再用的时候可以直接取。但如果我一直存着强引用,内存就会越堆越多;如果用弱引用,那对象没人用时就自动释放了,缓存只在需要的时候才帮我“记得一下”。

Python 怎么用弱引用?

Python 内置了 weakref 模块。最基础的就是 weakref.ref,它会返回一个“弱引用对象”,你要取里面的原始对象,需要再调用一下。

可以看到,当 u 被删掉后,弱引用马上就变成 None 了,不会阻止对象回收。

弱引用的容器

除了单个 ref,其实还有更方便的弱引用集合,比如 WeakKeyDictionary 和 WeakValueDictionary,它们就是字典,但存的 key 或 value 是弱引用。常见用法就是做缓存,或者对象和额外信息的绑定。

这样你就不用担心缓存越来越大,没用的对象会自动清理掉。

弱引用的限制

不过弱引用也不是所有对象都支持,比如 intstr 这种内建的不可变类型就不行。原因是这些对象在 Python 内部可能会被复用或者优化,不适合加弱引用。一般来说,自定义类实例是没问题的。

弱引用其实就是个“不打扰”的方式:我可以“看着你”,但是不阻止你被回收。它最大的用处是缓存、对象跟踪、避免循环引用。用得好的话,能帮你省不少内存管理的麻烦。

以上就是“什么是 Python 的 弱引用 (weakref)?的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取