Python“内存管理”之引用计数

大家好,还记得我们为什么要进行内存管理吗?因为变量在创建的过程中会在内存中申请一块区域,通过new语句、malloc语句动态申请的内存必须经过手动释放,否则就会变成“脏地址”,也就是内存泄露,久而久之,内存总有一天会被耗尽。有人会问,什么是“脏地址”呢?我举个例子,大家就清楚了。

上述代码首先定义了一个列表list1,然后又给list1重新赋值。这些操作在内存中是怎么实现的呢?

首先在内存46036192处创建了一个列表['hello','python','welcome to Beijing'],然后定义了一个名为list1的变量,变量值为46036192,其效果也就是变量list1指向了列表['hello','python','welcome to Beijing'],在Python中list1也被称为该列表的一个引用;系统通过list1就能顺藤摸瓜找到这个列表;接下来呢又创建了一个列表[1,2,3,4,5,6,7],并把它赋给list1,实际效果就是list1的变量值更改为46079472,于是list1指向了第二个列表,第一个列表失去了引用,虽然列表里面还有值,但我们无法通过任何手段对其进行利用,这就是本文所说的“脏地址”。

在C语言编程的时候,这种情况真的是太常见了,尤其是初学者一不留心就会忘记释放内存,大家想想有没有什么办法能杜绝这种现象?大家先考虑,我们再看一个小例子。

我们定义了一个类quoteTest,里面有个方法__del__,它的作用是当对象被销毁时调用,OK,我们利用这个类做个小实验。

首先创建了一个quoteTest类的对象Q1,然后通过执行赋值语句定义了Q2、Q3,通过id()函数,我们发现Q1、Q2、Q3其实都指向了同一个对象,它们都是该对象的引用,专业解释就是,该quoteTest类对象的引用计数为3,紧接着调用del方法销毁对象,我们发现直到Q1、Q2、Q3全被销毁后,__del__函数才被触发。也就是每调用一次del方法,删除对象的一个引用,当引用为0时,对象才被销毁。这也就是《Python之“内存管理机制”初探》里面提到的引用计数和垃圾回收。Python垃圾回收机制会寻找那些引用计数为0的对象,并把它所占的内存释放。

突然想起之前看过的一部动漫,我借用引用计数介绍一下剧情,A和B两个人以其在人世间的存在作为赌注进行无限次赌博,每一次赌局中,输的一方在别人中的记忆就会被强制删除一份,也就是删除一个引用,当人世间所有关于他的记忆都被删除了,他在人世间的存在也就被抹掉了。很残酷是吧,当时看的我都心惊肉跳的。

啰啰嗦嗦这么多,大家也明白Python“内存管理机制”是什么样子的了,说白了也就是有一双上帝之手在帮我们对所有对象的引用进行计数,并定期删除引用为0的对象。想知道这双上帝之手是咋回事的,可以发消息给我,如果想学的朋友比较多,我们就讲一下Python“上帝之手”之内存池机制。

,今天的内容就这些,大家好好理解一下,有不懂的及时问我或找度娘哈!感谢大家的关注和阅读,以后还会有更多的编程精品,敬请享用,谢谢!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180619G04ZRS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券