Python 基础:引用计数

liftword1个月前 (03-20)技术文章19

J引用计数 是ython 内存管理系统中的一个核心概念。通过了解引用计数的工作原理,您可以深入了解 Python 如何处理内存中的对象、回收未使用的资源以及避免内存泄漏。

什么是参考计数?

其核心:

  • 引用计数跟踪指向内存中对象的变量或引用的数量。
  • 当对象的引用计数降至零时,Python 会自动释放该对象占用的内存,使其可供重用。

引用计数的工作原理

让我们用一个例子来分解它:

以下是幕后发生的事情:

  1. Python 在特定内存地址(例如 1000)处创建一个值为 10int 类型的对象。
  2. my_var 将成为对该对象的引用(或指针)。

此时,对象 10 的引用计数为 1,因为只有 my_var 引用它。

添加引用

现在,让我们添加对同一对象的另一个引用:

以下是发生的情况:

  • other_var 不会创建新对象或复制值 10。相反,它指向与 my_var 相同的内存地址(例如,1000)。
  • 对象 10 的引用计数增加到 2

删除引用

删除引用时,引用计数会减少。例如:

  • my_var不再指向对象 10
  • 10 的引用计数将回落为 1

如果我们删除最后一个引用:

现在,10 的引用计数下降到 0,Python 的内存管理器释放了对象占用的内存。

用于检查引用计数的工具

Python 提供了用于检查对象的引用计数的工具。让我们来探讨两种常用的方法:

使用 sys.getrefcount

sys 模块提供 getrefcount 函数,该函数返回对象的引用计数:

但是,有一个问题:调用 sys.getrefcount 会临时添加对对象的另一个引用(从函数内部),因此计数始终至少比预期高 1。

使用 ctypes 进行准确计数

要避免 getrefcount 创建的额外引用,您可以使用 ctypes 模块。此方法直接从内存中检索引用计数:

此方法提供准确的计数,而无需 sys.getrefcount 引入的额外引用。

参考计数的实际示例

让我们看一些场景来观察引用计数是如何变化的:

单个和多个引用

此处,abc 都引用同一对象,因此引用计数为 3

删除引用

删除引用后,计数会减少。

对象超出范围

当变量超出范围时(例如,在函数调用之后),它们的引用会自动删除:

为什么参考计数很重要

引用计数是 Python 内存管理的基础。以下是它很重要的原因:

  1. 高效的内存使用:
    通过跟踪引用,Python 可确保在不再需要对象时释放内存。
  2. 垃圾回收支持:
    引用计数与 Python 的垃圾回收器一起使用,后者处理更复杂的内存场景(如循环引用)。
  3. 调试和优化:
    sys.getrefcountctypes 等工具可以帮助您调试内存问题并优化代码,尤其是在长时间运行的应用程序中。

常见陷阱和最佳实践

  1. 误解 sys.getrefcount
    始终从
    getrefcount 返回的值中减去 1,以考虑它创建的临时引用。
  2. 避免手动内存管理:
    Python 为您处理内存,因此很少需要手动操作(例如直接使用内存地址)。
  3. 当心循环引用:
    仅引用计数无法处理循环引用。例如:

Python 的垃圾回收器可以处理这些情况,但最好了解一下。

引用计数是 Python 内存管理系统的基本部分。它确保在不再需要对象时自动清理对象,让您专注于编写代码,而无需担心手动内存管理。

相关文章

分享一个文件整理使用Python小脚本(删除相同文件减小内存占用)

写在前面:脚本作用:在目标文件夹中筛选出大小相同的文件,并打印在屏幕上,这样可以快速找出相同文件,释放硬盘内存。前期部署:安装python并做好配置环境变量(基础)先上代码:import osfrom...

一文掌握Python内存管理

Python中的内存是由Python内存管理器(Python memory manager)来管理的,它涉及到一个包含所有Python对象和数据结构的私有堆(heap)。Python内存管理器有不同的...

Python 的内存管理与垃圾回收

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者| 慕课网精英讲师 朱广蔚1. 内存管理概述1.1 手动内存管理在计算机发展的早期,编程语言提供了手动内存管理的机制,例如...

喂!你这个python的内存是不是爆了?喏,拿这个去测试一下看看

你是否曾经为python程序的内存占用问题头疼不已?是否觉得内存泄漏、对象占用过多内存等问题难以排查?别急,今天我要介绍一个神器——pympler,让你轻松搞定python内存分析!01什么是pymp...

面试必备:Python内存管理机制(建议收藏)

什么是内存管理器(what)Python作为一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言,与大多数编程语言不同,Python中的变量无需事先申明,变量无需指定类型,程序员无需关心内存管...

面试必备 | Python 垃圾回收机制

众所周知,Python 是一门面向对象语言,在 Python 的世界一切皆对象。所以一切变量的本质都是对象的一个指针而已。Python 运行过程中会不停的创建各种变量,而这些变量是需要存储在内存中的,...