
Python 的引用计数机制是其内存管理最基础、最直接的手段,核心思想很简单:每个对象内部维护一个计数器,记录当前有多少个变量(或容器)正“指向”它;当计数降为 0,对象立即被回收。
引用计数何时增加
以下情况会让对象的引用计数 +1:
- 变量赋值:a = [1, 2, 3] → 列表对象引用计数变为 1
- 作为参数传入函数:func(a) → 函数内部形参也持有一个引用,计数 +1
- 加入容器:b = [a] 或 c = {'key': a} → 容器持有对 a 的引用,计数 +1
- 使用 sys.getrefcount() 查看时,传参本身会临时增加 1(返回值比实际多 1,需注意)
引用计数何时减少
以下情况会让对象的引用计数 −1:
- 变量被重新赋值:a = 'new' → 原列表失去 a 这一引用
- 变量被显式删除:del a → 直接移除该引用
- 函数调用结束:局部变量(包括形参)生命周期终止,引用自动释放
- 容器被销毁或元素被弹出:b.pop(0) 或 del b → 若该容器是对象唯一持有者,计数归零
引用计数的局限性
它无法解决循环引用问题。例如:
立即学习“Python免费学习笔记(深入)”;
PHP5学习对象教程由美国人古曼兹、贝肯、瑞桑斯编著,简张桂翻译,电子工业出版社于2007年12月1日出版的关于PHP5应用程序的技术类图书。该书全面介绍了PHP 5中的新功能、编程方法及设计模式,还分析阐述了PHP 5中新的数据库连接处理、错误处理和XML处理等机制,帮助读者系统了解、熟练掌握和高效应用PHP。
a = []
a.append(a) # a 指向自己,形成环
del a
此时列表对象的引用计数不会降到 0(因为自身还持有一个引用),但已无法从外部访问。这类对象需依赖 Python 的**循环垃圾收集器(gc 模块)**周期性扫描并清理,引用计数机制对此无能为力。
查看与验证引用计数
可用 sys.getrefcount(obj) 查看(注意:调用它本身会让计数临时 +1);配合 id() 可确认是否为同一对象:
import sys
a = [1, 2, 3]
print(id(a), sys.getrefcount(a)) # 如输出 140... 2(含 getrefcount 的临时引用)
b = a
print(sys.getrefcount(a)) # 变为 3
这种即时性让引用计数成为 Python 对象生命周期最可预测的一环,也是理解内存行为的第一步。









