python中的弱引用weakref

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'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值