python中的变量与垃圾回收 python中的变量和java中的变量本质是不一样的,python中的变量实质上是一个指针(指针的大小固定的)
is可以用来判断id是否相等
对于这种赋值,虽然所赋值是相同的 , 但是他们的id不同,即他们是不同的对象,aisb 即为false ,但是有个特例: a = 1b = 1 时他们的id相同 。其实这是python内部的优化机制,对于小整数和小的字符串来说,python在前边定义一个对象时,下次在遇到时会直接调用前边生成的对象 , 而不会去重新申请一个 。
他们的对象内存地址不一样,但是,a和b里的值是相等的,这是由于a和b都为list,而list里有内置的魔法函数 eq 通过 eq 魔法函数可以判断里边两个的值是否相同,若相同则返回True
python中垃圾回收的算法回收的算法是采用引用计数,当程序中有一个变量引用该python对象时 , python会自动保证该对象引用计数为1;当程序中有两个变量引用该python对象时,python会自动保证该对象计数器为2,以此类推 , 当一个对象的引用计数器变为0 时,则说明程序中不再有变量对其进行引用 , 因此python就会回收该对象 。
大多数情况,python的ARC都能准确 , 高效的回收系统中的每一个对象 。但如果系统中出现循环引用时,比如a对象持有一个实例变量引用对象b , 而b对象又持有一个实例变量引用对象a,此时 两个对象的计数器都为1,而实际上python不再需要这两个对象,也没有程序在引用他们,系统回收他们时python的垃圾回收器就没有那儿快,要等到专门的循环垃圾回收器(Cyclic Garbage Collector)来检测并回收这种引用循环
当一个对象被垃圾回收式,python就会自动调用该对象的 del 方法
当没有注释掉x = im时 , item对象被两个变量所引用,所以在执行完del im时并不会去回收item对象,所以先输出--------,当程序完全执行完成后 , 引用item的对象的变量被释放,然后系统便会执行 del 方法,回收item对象 。
当 x = im被注释后,只有一个变量去引用item对象,所以在执行完后程序变回去调用 del 方法,回收item对象,然后在继续向下执行 输出-----
Python如何进行内存管理Python的内存管理,一般从以下三个方面来说:
1)对象的引用计数机制(四增五减)
2)垃圾回收机制(手动自动,分代回收)
3)内存池机制(大m小p)
1)对象的引用计数机制
要保持追踪内存中的对象,Python使用了引用计数这一简单的技术 。sys.getrefcount(a)可以查看a对象的引用计数 , 但是比正常计数大1,因为调用函数的时候传入a , 这会让a的引用计数+1
2)垃圾回收机制
吃太多,总会变胖 , Python也是这样 。当Python中的对象越来越多,它们将占据越来越大的内存 。不过你不用太担心Python的体形,它会在适当的时候“减肥” , 启动垃圾回收(garbage
collection),将没用的对象清除
从基本原理上,当Python的某个对象的引用计数降为0时 , 说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了
比如某个新建对象,它被分配给某个引用,对象的引用计数变为1 。如果引用被删除 , 对象的引用计数为0,那么该对象就可以被垃圾回收 。
然而,减肥是个昂贵而费力的事情 。垃圾回收时,Python不能进行其它的任务 。频繁的垃圾回收将大大降低Python的工作效率 。如果内存中的对象不多,就没有必要总启动垃圾回收 。
所以,Python只会在特定条件下,自动启动垃圾回收 。当Python运行时,会记录其中分配对象(object
推荐阅读
- 计算机文员毕业设计选题,计算机文员毕业设计选题怎么写
- pg数据库什么时候会爆满,pgs数据库
- phpcms注册登录,php登录注册页面
- sqlserver获取第一条数据,sql语句取第一条数据
- mysql查询到结果后截取4位,mysql查询字段截取
- 大整数乘法代码java java计算大整数的阶乘
- 如何营销健康的汉堡,汉堡营销活动方案
- 怎么做ppt电脑,怎么做ppt电脑上
- 华为云怎么选服务器,华为云服务类型怎么选