Python内存管理机制 之 引用计数

参考链接:https://www.cnblogs.com/geaozhang/p/7111961.html#lajihuishou

                  https://www.cnblogs.com/neillee/p/6259590.html

目录

一、Python的引用计数

二、引用计数的增减

2.1 增加引用计数

2.2 减少引用计数

2.3 del语句

2.4 引用计数法有很明显的优点:


一、Python的引用计数

要保持追踪内存中的对象,Python使用了引用计数这一简单的技术。

sys.getrefcount(a)可以查看a对象的引用计数,但是比正常计数大1,因为调用函数的时候传入a,这会让a的引用计数+1

二、引用计数的增减

2.1 增加引用计数

当对象被创建并(将其引用)赋值给变量时,该对象的引用计数被设置为1。

对象的引用计数增加的情况:

  • 对象被创建:x = 3.14
  • 另外的别名被创建:y = x
  • 对象被作为参数传递给函数(新的本地引用):foobar(x)
  • 对象成为容器对象的一个元素:myList = [123, x, 'xyz']

2.2 减少引用计数

对象的引用计数减少的情况:

  • 一个本地引用离开了其作用范围。如fooc()函数结束时,func函数中的局部变量(全局变量不会)
  • 对象的别名被显式销毁:del y
  • 对象的一个别名被赋值给其他对象:x = 123
  • 对象被从一个窗口对象中移除:myList.remove(x)
  • 窗口对象本身被销毁:del myList

2.3 del语句

Del语句会删除对象的一个引用,它的语法如下:del obj[, obj2[, ...objN]]

例如,在上例中执行del y会产生两个结果:

  • 从现在的名称空间中删除y
  • x的引用计数减1

2.4 引用计数法有很明显的优点:

  1. 高效
  2. 运行期没有停顿,也就是实时性:一旦没有引用,内存就直接释放了。同时把处理回收内存的时间分摊到了平时。
  3. 对象有确定的生命周期
  4. 易于实现

2.5 引用计数机制的缺点:

  • 维护引用计数消耗资源
  • 循环引用
list1 = []
list2 = []
list1.append(list2)
list2.append(list1)

list1与list2相互引用,如果不存在其他对象对它们的引用,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收,这将是致命的。 对于如今的强大硬件,缺点1尚可接受,但是循环引用导致内存泄露,注定python还将引入新的回收机制。(标记清除和分代收集)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值