简要理解Python引用计数器

  动态类型是Python的重要特色之一,即Python中对象的类型和内存都是在运行时确定的,每个对象会在内存中申请开辟一块空间来保存该对象,该对象在内存所在位置的地址被称为“引用”,对于内存中的对象Python会采用一种称为“引用计数”的方式进行管理,Python会对每个对象记录其引用数。例如:

>>> a = 5.8
>>> id(a)
2115069375952
>>> b = 5.8
>>> id(b)
2115070185136
>>> id(5.8)
2115070952016
>>> c = a
>>> id(c)
2115069375952

  每个对象被创建时都会获得一个身份 id(即对象在其生命周期内位于内存中的地址),并伴随一个引用计数器。数据对象 5.8 被创被赋值给变量 a,则该数据对象的引用计数器就增加 1,可以利用 id()函数查看变量a引用的数据对象5.8的 id值。
  如果把同样大小的 5.8 赋值给变量 b 并通过 id()函数查看 b 的 id,发现它和 a的id是不一样的,说明变量a和 b 并未指向相同的数据对象,虽然都是 5.8,但Python却在执行两个赋值语句时创建了两个浮点数对象 5.8,这两个 5.8 分别存储在不同的内存空间中。
  单独使用 id(5.8)返回的又是另外一个不同的 id 值,这是因为此处的 5.8 其实是第3个新创建的数据对象,与前两个5.8 是不同的对象。而执行“c=a”后查看变量c的id,会发现其与a的id一样,即变量c和a指向了相同的数据对象。
  如图所示,3 个5.8 数据对象分别存放在不同的存储空间,a和c引用的对象5.8目前引用计数器为2,其中a是第1个引用,c是第 2 个引用,而b引用的对象引用计数器为1。
在这里插入图片描述
如果再执行如下代码:

>>> c = 567.8
>>> id(c)
2115070952016

  执行过后,c指向了另外一个对象,c 的 id 值变化了,原来 a、c 同时指向数据对象 5.8的引用计数器就要减 1。如果某对象的引用计数器减少至 0,则该对象的内存空间将被内存管理者回收。

参考文献:《Python程序设计》(张莉主编,高等教育出版社)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloudy_Nebula

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值