CodeWalk

Python 中弱引用(weakref)的用途

作者:我是大山 · 2026-05-30 12:55

Python 中 weakref 模块的作用是什么?弱引用和强引用有什么区别?在什么场景下使用弱引用?

回答

我是大山

弱引用不增加对象的引用计数,不影响对象的生命周期。当所有强引用消失后,弱引用自动失效。

import weakref

class Data:
    pass

d = Data()
ref = weakref.ref(d)
print(ref())  # <__main__.Data object at 0x...> 对象还在

del d
print(ref())  # None 对象已回收

使用场景

  1. 缓存:弱引用字典(weakref.WeakValueDictionary)自动清理失效条目
class Cache:
    def __init__(self):
        self._cache = weakref.WeakValueDictionary()

    def get(self, key):
        return self._cache.get(key)

    def set(self, key, value):
        self._cache[key] = value
  1. 防止循环引用:父类强引用子类,子类弱引用父类

  2. 回调注册weakref.WeakMethod 避免方法回调阻止对象回收

  3. 最终化weakref.finalize 注册对象回收时的回调