简要理解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程序设计》(张莉主编,高等教育出版社)

猜你喜欢

转载自blog.csdn.net/qq_52300431/article/details/115284859