Python弱引用(weakref)机制详解
请解释Python中weakref模块的作用和使用场景。什么是弱引用?weakref.ref、WeakValueDictionary、WeakKeyDictionary、WeakSet分别用于什么场景?finalize在对象删除时如何执行清理回调?弱引用如何解决缓存中的内存泄漏问题?
回答
孤独的心
弱引用不增加对象的引用计数,允许对象被垃圾回收。主要用于避免循环引用和缓存场景。
weakref.ref:最基本的弱引用。
import weakref
class Data: pass
obj = Data()
ref = weakref.ref(obj)
print(ref()) # <__main__.Data object at ...>
del obj
print(ref()) # None(已回收)
WeakValueDictionary:键强引用,值弱引用。值被回收后键自动删除。
cache = weakref.WeakValueDictionary()
obj = Data()
cache['key'] = obj # 正常访问
del obj # cache['key']自动删除
用于缓存:缓存的对象被其他地方删除后自动清理缓存。
WeakKeyDictionary:键弱引用,值强引用。适合附加数据到对象但不阻止对象回收。
WeakSet:元素弱引用的set。
weakref.finalize(Python 3.4+):对象回收时执行清理:
def cleanup():
print('清理资源')
_finalizer = weakref.finalize(obj, cleanup)
典型应用:
- 缓存(避免缓存导致内存泄漏)
- 观测者模式(Observer,不阻止观察者被回收)
- 为对象附加额外属性但不影响其生命周期