python中的变量与垃圾回收

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中的变量与垃圾回收相关的知识,希望对你有一定的参考价值。

参考技术A

python中的变量和java中的变量本质是不一样的,python中的变量实质上是一个指针(指针的大小固定的)

is可以用来判断id是否相等

对于这种赋值,虽然所赋值是相同的,但是他们的id不同,即他们是不同的对象,a is b 即为false ,但是有个特例: a = 1 b = 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垃圾箱-垃圾回收

python的优化机制与垃圾回收与gc模块

简单理解python的垃圾回收机制

详解python的垃圾回收机制

Python引用复制,参数传递,弱引用与垃圾回收