[Pyhton]weakref 弱引用

文档中的解释: https://docs.python.org/2/library/weakref.html

wiki 中的解释: 在计算机程序设计中,弱引用,与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用。一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收。主要作用就是减少循环引用,减少内存中不必要的对象存在的数量。

更详细的请查看wiki百科


简单理解:

python中的垃圾回收机制是是引用计数器。当一个对象的引用数目为0的时候,才会被从内存中回收。当出现循环引用的时候,垃圾回收就变得不可靠了。


通过一段代码来比较:

# -*- encoding=utf-8 -*-
'''
author: orangleliu

python 弱引用的小实验
'''

import weakref
import gc

class NewObj(object):
    def my_method(self):
        print "called me "

obj = NewObj()
r = weakref.ref(obj)
gc.collect()
print  r() is obj

obj = 1
gc.collect()  #
print  r() is None, r()

print '*******************'
obj = NewObj()
s = obj
gc.collect()
print s is obj

obj = 1
gc.collect()
print s is None, s

对比结果:

True
True None
*******************
True
False <__main__.NewObj object at 0x024FB870>


很容易看到结果,弱引用计数器没有增加,所以当obj不在引用NewObj的时候,NewObj对象就被释放了,所以r的引用对象就没了。后面的s对象和我们平时用的引用对象是一样的,s =obj 时候,引用计数器+1,所以当obj不在指向NewObj的时候,s仍然指向NewObj,此时对NewObj的引用计数为2-1=1.


通过实验可以看到了原理,可以这个弱引用一般在什么具体的情况下用呢,怎么避免了循环引用,可以参考 Pymontw中的案例:http://pymotw.com/2/weakref/

实际开发中还没怎么处理过这个问题,以后用到在深入研究


本文出自 “orangleliu笔记本” 博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/40718121

作者: orangleliu  



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值