1. 弱引用的作用
弱引用是为了解决循环引用(circular reference)的问题:对象存在__del__()方法时可能导致内存泄露。
对对象的弱引用不能保证对象存活:当对像的引用只剩弱引用时, garbage collection 可以销毁引用并将其内存重用于其他内容。但是,在实际销毁对象之前,即使没有强引用,弱引用也一直能返回该对象。python docs
2. 对比weakref.ref()和weakref.proxy()
看上去,weakref.proxy()使用起来更方便。
import weakref
class printer:
def __init__(self,a):
self.a = a
print('a=%d'%a)
obj_a = printer(10)
obj_b = weakref.ref(a)
obj_c = weakref.proxy(a)
# ========== address
# obj_a: <__main__.printer object at 0x7fc325488a90>
# obj_b: <weakref at 0x7fc325492a10; to 'printer' at 0x7fc325484d50>
# obj_c: <weakproxy at 0x7fc325492b30 to printer at 0x7fc325484d50>
# ========== content:
# a.a=10, b().a=10, c.a=10
# b.a报错:AttributeError: 'weakref' object has no attribute 'a'