平时写 Python 程序,大家可能都习惯直接 new 一个对象,用完了就交给垃圾回收(GC)去管,对吧?但是有时候你会遇到一种情况:我想要“记住”某个对象,但又不想因为我保存了它,导致它永远不被回收,这时候就得用到弱引用(weakref)。
弱引用的意思其实很直白,就是“我知道你在那儿,但我不强行拉着你”。Python 默认的引用(比如直接赋值给变量、放进 list/dict)都会让对象的引用计数 +1,从而保证对象活着。而弱引用不增加这个计数,也就是说,当没有强引用时,即使还有弱引用指着它,对象还是会被 GC 干掉。
为什么需要弱引用?
举个常见的场景:做缓存。比如我写了个图片处理的小工具,加载过的图片对象我想放到一个字典里,下次再用的时候可以直接取。但如果我一直存着强引用,内存就会越堆越多;如果用弱引用,那对象没人用时就自动释放了,缓存只在需要的时候才帮我“记得一下”。
Python 怎么用弱引用?
Python 内置了 weakref 模块。最基础的就是 weakref.ref,它会返回一个“弱引用对象”,你要取里面的原始对象,需要再调用一下。
可以看到,当 u 被删掉后,弱引用马上就变成 None 了,不会阻止对象回收。
弱引用的容器
除了单个 ref,其实还有更方便的弱引用集合,比如 WeakKeyDictionary 和 WeakValueDictionary,它们就是字典,但存的 key 或 value 是弱引用。常见用法就是做缓存,或者对象和额外信息的绑定。
这样你就不用担心缓存越来越大,没用的对象会自动清理掉。
弱引用的限制
不过弱引用也不是所有对象都支持,比如 int、str 这种内建的不可变类型就不行。原因是这些对象在 Python 内部可能会被复用或者优化,不适合加弱引用。一般来说,自定义类实例是没问题的。
弱引用其实就是个“不打扰”的方式:我可以“看着你”,但是不阻止你被回收。它最大的用处是缓存、对象跟踪、避免循环引用。用得好的话,能帮你省不少内存管理的麻烦。
以上就是“什么是 Python 的 弱引用 (weakref)?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://www.phpxs.com/post/13472/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料