博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python基础系列:初识python引用计数与弱引用
阅读量:7036 次
发布时间:2019-06-28

本文共 844 字,大约阅读时间需要 2 分钟。

写在前边:

之前的socket系列就告一段落,主要是对自己所学做一个总结与记录。

接下来我打算基于libevent写一个支持并发的HTTP服务器。因为之前学习群里大神早就开发过一个同时支持HTTP与WebSocket的服务器,我看了之后感觉很有兴趣,所以才买了本网络编程的书来看。我打算参考他的来写一个精简版,

只支持HTTP。等写完了可以分享给大家,虽然不能运用到生产环境,但是我相信学习完源码之后对于自己也是一个极大的提升。

接下来进入主题:

先放上实例代码:

图片描述

我们创建一个用于测试的x对象,包括一个构造函数和一个析构函数。

第一次初始化x对象,并且用变量a来引用,所以这里的引用计数就为1。之后通过 getrefcount 来获取引用数量,这里变为了2,因为调用函数 getrefcount 本身也是对a的一次引用。

接下来通过 weakref.ref() 创建一个弱引用,通过 getrefcount 打印引用计数后,发现计数并没有改变。

w() is a 这句的意思是判断这两个实例是不是完全相同,也就是占用的内存地址是否相同。

然后我们通过 del a 来解除a对x对象的引用,注意这里del并不是直接回收x对象,而是解除了引用,我们知道一旦一个变量的引用为0的时候就会被回收。所以调用del之后x对象被回收。

通过之前的代码我们看到,调用弱引用的方式为类函数的方式。不过可以使用proxy来改为使用变量名的方式调用。

图片描述

到这里我相信对于弱引用的使用方式肯定都掌握了。但是弱引用到底有什么作用呢?

与很多其它的高级语言一样,Python也有垃圾回收机制。每个对象都有一个引用计数,当这个计数为0的时候才能够安全地销毁这个对象。

由于一次仅能有一个对象被回收,引用计数无法回收循环引用的对象。一组相互引用的对象若没有被其它对象直接引用,并且不可访问,则会永久存活下来。

一个应用程序如果持续地产生这种不可访问的对象群组,就会发生内存泄漏。

所以弱引用很适合处理这种循环引用的场景。

转载地址:http://qzfal.baihongyu.com/

你可能感兴趣的文章
Windows编译OpenSSL
查看>>
BNUOJ34977夜空中最亮的星(数学,向量的应用)
查看>>
[Elasticsearch] 向已存在的索引中加入自己定义filter/analyzer
查看>>
…… are only available on JDK 1.5 and higher 错误
查看>>
[C#]_[使用微软OpenXmlSDK (OpenXmlReader)读取xlsx表格] 读取大数据量100万条数据Excel文件解决方案...
查看>>
Flowable 的event介绍
查看>>
WIN10平板 如何设置不允许切换竖屏
查看>>
WPF异常捕获三种处理 UI线程, 全局异常,Task异常
查看>>
【mysql】mysql统计查询count的效率优化问题
查看>>
JDK7 异常的多重捕获
查看>>
这个PHP无解深坑,你能解出来吗?(听说能解出来的都很秀)
查看>>
[Angular] Refactor Angular Component State Logic into Directives
查看>>
一种实现个人微信支付宝二维码收款接口的方法
查看>>
关于长连接的两篇文章
查看>>
Mysql delete,truncate,drop
查看>>
RHEL/CentOS/Fedora各种源(EPEL、Remi、RPMForge、RPMFusion)配置
查看>>
c#初学-使用 Override 和 New 关键字进行版本控制(C# 编程指南)
查看>>
HTML中解决双击会选中文本的问题
查看>>
CentOS 安装apache
查看>>
JS 对java返回的json格式的数据处理
查看>>