CodeWalk

Python弱引用(weakref)机制详解

作者:孤独的心 · 2026-05-30 12:55

请解释Python中weakref模块的作用和使用场景。什么是弱引用?weakref.refWeakValueDictionaryWeakKeyDictionaryWeakSet分别用于什么场景?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)

典型应用

  1. 缓存(避免缓存导致内存泄漏)
  2. 观测者模式(Observer,不阻止观察者被回收)
  3. 为对象附加额外属性但不影响其生命周期