Python 的内存管理由解释器负责,核心是引用计数加垃圾回收器(gc模块);引用计数实时增减并立即释放归零对象,而循环引用需gc周期性处理,del仅解绑变量名,不保证即时释放内存。

Python 的内存管理由谁负责?
Python 不需要手动释放内存,是因为解释器内置了自动内存管理机制,核心是引用计数 + 垃圾回收器(gc 模块)。你创建一个对象,比如 a = [1, 2, 3],解释器会立刻给它加引用计数;当 a 被重新赋值、离开作用域或显式删除(del a),计数减一;一旦计数归零,内存立即被回收。
- 引用计数是实时的,也是 Python 内存释放最主要、最及时的机制
- 循环引用(如两个对象互相持有对方的引用)无法靠引用计数清理,这时依赖
gc.collect()触发的周期性垃圾回收 -
gc默认启用,但回收时机不固定,也不保证立即释放——它只在满足阈值或显式调用时运行
为什么 del 不等于“立刻释放”?
del 只是解除变量名与对象之间的绑定,不是强制清内存。是否真正释放,取决于该对象是否还有其他引用。
-
a = [1, 2, 3]; b = a; del a→ 对象没被释放,因为b还引用着它 -
a = []; del a→ 若无其他引用,引用计数归零,内存马上还给解释器 - 在 CPython 中,即使内存被回收,也未必立刻归还操作系统(尤其是小块内存),可能缓存在解释器内部供后续分配复用
哪些情况会让内存“看起来没释放”?
实际开发中常误以为内存泄漏,其实是机制特性导致的假象:
- 使用了全局缓存(如
cache = {})且不断往里塞数据,引用一直存在 - 日志、调试器、IDE 的变量查看器会隐式持有对象引用(尤其在交互式环境或断点处)
- C 扩展模块(如某些 NumPy 或数据库驱动)绕过 Python 引用计数,需按各自规则管理内存
- 大对象(如超大列表、DataFrame)被引用后,即使删掉变量,若底层用了 mmap 或池化分配,OS 层看不到内存下降
需要手动干预的少数场景
绝大多数纯 Python 代码完全不用管内存,但以下情况例外:
本文档主要讲述的是关于Objective-C手动内存管理的规则;在ios开发中Objective-C 增加了一些新的东西,包括属性和垃圾回收。那么,我们在学习Objective-C之前,最好应该先了解,从前是什么样的,为什么Objective-C 要增加这些支持。有需要的朋友可以下载看看
立即学习“Python免费学习笔记(深入)”;
- 长期运行的服务中,有明确生命周期的大对象(如缓存、连接池),建议显式置为
None或调用clear()方法切断引用链 - 怀疑循环引用影响资源释放(比如自定义类中有
del方法),可临时启用gc.set_debug(gc.DEBUG_COLLECTABLE)观察 - 在嵌入式或内存极度受限环境(如 MicroPython),CPython 的自动机制不可用,得切换策略
引用计数的即时性容易让人误以为“所有内存都秒退”,其实循环引用、C 层资源、OS 分配策略这些环节才是真实世界里最常卡住内存的地方。









