摘要:第一次初始化对象,并且用变量来引用,所以这里的引用计数就为。接下来通过创建一个弱引用,通过打印引用计数后,发现计数并没有改变。由于一次仅能有一个对象被回收,引用计数无法回收循环引用的对象。所以弱引用很适合处理这种循环引用的场景。
写在前边:
之前的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的时候才能够安全地销毁这个对象。
由于一次仅能有一个对象被回收,引用计数无法回收循环引用的对象。一组相互引用的对象若没有被其它对象直接引用,并且不可访问,则会永久存活下来。
一个应用程序如果持续地产生这种不可访问的对象群组,就会发生内存泄漏。
所以弱引用很适合处理这种循环引用的场景。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/42455.html
摘要:内部通过引用计数机制来统计一个对象被引用的次数。下一步,就该被我们的垃圾回收器给收走了。而我们垃圾回收机制只有当引用计数为的时候才会释放对象。以空间换时间的方法提高垃圾回收效率。 人生苦短,只谈风月,谈什么垃圾回收。据说上图是某语言的垃圾回收机制。。。我们写过C语言、C++的朋友都知道,我们的C语言是没有垃圾回...
摘要:里,有两种方法获得一定范围内的数字返回一个列表,还有返回一个迭代器。在引用计数的基础上,还可以通过标记清除解决容器对象可能产生的循环引用的问题。列举常见的内置函数的作用,过滤函数,循环函数累积函数一行代码实现乘法表。 showImg(https://segmentfault.com/img/remote/1460000019294205); 1、为什么学习Python? 人生苦短?人间...
摘要:所以,应该直接了当的安装,其中也会自动安装上,作为其运行的。这只是一开始,之后还有里各种找不到外部安装的的情况。终于,意识到这些方法都是错误的思路。这才知道原来是无法识别。 为什么要用IPython/Jupyter? python里面调试确实有点烦恼,尤其是在vim里,想要尝试一些简单的编码问题,实在是有点麻烦,不想到命令行模式一行一行执行,也不想再新建一个文件测试一个简单的功能。 而...
摘要:所以,应该直接了当的安装,其中也会自动安装上,作为其运行的。这只是一开始,之后还有里各种找不到外部安装的的情况。终于,意识到这些方法都是错误的思路。这才知道原来是无法识别。 为什么要用IPython/Jupyter? python里面调试确实有点烦恼,尤其是在vim里,想要尝试一些简单的编码问题,实在是有点麻烦,不想到命令行模式一行一行执行,也不想再新建一个文件测试一个简单的功能。 而...
阅读 2328·2021-09-22 15:15
阅读 609·2021-09-02 15:11
阅读 1749·2021-08-30 09:48
阅读 1833·2019-08-30 15:56
阅读 1424·2019-08-30 15:52
阅读 2003·2019-08-30 15:44
阅读 400·2019-08-29 16:29
阅读 1511·2019-08-29 11:06