美文网首页
python中的变量与垃圾回收

python中的变量与垃圾回收

作者: 原来不语 | 来源:发表于2019-01-19 22:49 被阅读0次

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

a = 1
a = "abc"
#1.a贴在1上面
#2.先生成对象,然后便利贴

a= [1, 2, 3]
b=a
print(id(a), id(b))  #a和b是同一个对象
print (a is b)

 #结果
140519998094152 140519998094152
True

is 和 ==的区别

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

a = [1, 2, 3, 4]
b = [1 ,2, 3, 4]

140519998162248 140519998864264
False

对于这种赋值,虽然所赋值是相同的,但是他们的id不同,即他们是不同的对象,a is b 即为false ,但是有个特例: a = 1 b = 1 时他们的id相同。其实这是python内部的优化机制,对于小整数和小的字符串来说,python在前边定义一个对象时,下次在遇到时会直接调用前边生成的对象,而不会去重新申请一个。

a = [1, 2, 3, 4]
b = [1 ,2, 3, 4]
print(id(a), id(b))
print(a == b)

140519999248264 140519999070600
True

他们的对象内存地址不一样,但是,a和b里的值是相等的,这是由于a和b都为list,而list里有内置的魔法函数eq通过eq魔法函数可以判断里边两个的值是否相同,若相同则返回True

class  People:
      pass
person = People()
if type(person)  is People:  #在判断persion是一个什么类时就可以使用is  切记不可使用==, 或者使用isinstance()
    print("yes")

del语句和垃圾回收

python中垃圾回收的算法回收的算法是采用引用计数,当程序中有一个变量引用该python对象时,python会自动保证该对象引用计数为1;当程序中有两个变量引用该python对象时,python会自动保证该对象计数器为2, 以此类推,当一个对象的引用计数器变为0 时,则说明程序中不再有变量对其进行引用,因此python就会回收该对象。

大多数情况,python的ARC都能准确,高效的回收系统中的每一个对象。但如果系统中出现循环引用时,比如a对象持有一个实例变量引用对象b,而b对象又持有一个实例变量引用对象a,此时 两个对象的计数器都为1, 而实际上python不再需要这两个对象,也没有程序在引用他们,系统回收他们时python的垃圾回收器就没有那儿快,要等到专门的循环垃圾回收器(Cyclic Garbage Collector)来检测并回收这种引用循环

当一个对象被垃圾回收式,python就会自动调用该对象的del方法

对一个对象执行del操作,该变量不一定会回收,只有当对象的引用计数器变为0时,该对象才会被回收。因此,如果一个对象有多个变量引用它,那么del其中一个变量是不会回收该对象的。

class Item:
def __init__(self, name, price):
    self.name = name
    self.price = price 
#定义析构函数
def __del__(self):
    print('del删除对象')
#创建一个Item对象,将其赋给im变量
im = Item('鼠标', 29.8)
x = im
#打印im所引用的对象
del im
print("---------------")

结果为
---------------
del删除对象

若注释掉  x = im  结果则改变为如下

del删除对象
---------------

当没有注释掉x = im时, item对象被两个变量所引用,所以在执行完del im时并不会去回收item对象,所以先输出--------,当程序完全执行完成后,引用item的对象的变量被释放,然后系统便会执行del方法,回收item对象。

当 x = im被注释后,只有一个变量去引用item对象,所以在执行完后程序变回去调用del方法,回收item对象,然后在继续向下执行 输出-----

相关文章

  • python中的变量与垃圾回收

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

  • Python进阶6

    对象引用、垃圾回收、可变性 Python中的变量是什么 引言 Python和java中的变量本质不一样,java的...

  • Python垃圾回收机制

    垃圾回收机制: Python中的垃圾回收算法是采用引用计数, 当一个对象的引用计数为0时, Python的垃圾回收...

  • Python中的变量与垃圾回收机制

    Python与Java的变量本质上不一样,Python的变量本事是个指针。当Python解释器执行number=1...

  • 2018-09-14day20-内存管理机制

    掌握:1.数字、字符串、布尔的缓存2.垃圾回收机制中的引用计数机制 1.python中变量的赋值 python中所...

  • Dart---闭包函数

    1、全局变量特点:全局变量常驻内存,垃圾回收机制不会回收全局变量。2、局部变量的特点:用完即会被垃圾回收机制回收,...

  • 简谈垃圾回收机制

    简谈垃圾回收机制 什么是垃圾回收机制? 垃圾是堆中 unreferenced objects, 就是没有被变量引用...

  • Day11-Python垃圾回收机制笔记

    Python中的垃圾回收是以引用计数为主,标记清除和分代回收为辅。 【引用计数】 Python默认的垃圾收集机制是...

  • 2018-09-14 Day20-内存管理机制

    一、python中变量的赋值 掌握:(1)、数字、字符串、布尔值的缓存(2)、垃圾回收机制中的引用计数机制 pyt...

  • java局部变量对垃圾回收的影响

    结论 局部变量表中的变量是很重要的垃圾回收根节点,被局部变量表中变量直接或者间接引用的对象都不会被回收。 实验 看...

网友评论

      本文标题:python中的变量与垃圾回收

      本文链接:https://www.haomeiwen.com/subject/cottjqtx.html