讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 的循环引用垃圾回收机制详解

云枫酱_3125

云枫酱_3125

发布时间:2026-01-17 17:58:26

|

895人浏览过

|

来源于php中文网

原创

Python 的循环引用垃圾回收机制详解

python 垃圾收集器(gc)能自动检测并回收不可达的循环引用对象,但仅当这些对象完全脱离程序作用域(即无外部引用)时才会触发;单纯构造循环引用(如 a.append(b))本身不会导致立即回收。

在 Python 中,对象的生命周期主要由引用计数主导,而循环引用则依赖分代垃圾收集器(gc 模块) 进行周期性检测与清理。我们以如下代码为例深入分析:

a = [1, 2, 3]
b = [a, a]
a.append(b)

执行完毕后,内存结构形成一个双向引用环:

  • 列表 a([1, 2, 3, b])持有对 b 的引用;
  • 列表 b([a, a])持有对 a 的两个引用;
  • 同时,变量名 a 和 b 分别持有对两个列表的外部强引用。

此时,两个对象均被可达(reachable):可通过 a 访问整个结构,也可通过 b 间接访问 a。因此,不会被垃圾回收——引用计数均 ≥ 1,且 GC 不会主动打断仍被变量持有的活跃循环。

✅ 验证方式(可运行):

Python数据分析(免费版)
Python数据分析(免费版)

提供Python数据清洗、统计分析与可视化建议,覆盖业务报表与科研数据的快速处理流程。

下载

立即学习“Python免费学习笔记(深入)”;

import gc

a = [1, 2, 3]
b = [a, a]
a.append(b)

print(len(gc.get_referrers(a)))  # 通常 ≥ 3(a自身、b中两个元素)
print(len(gc.get_referrers(b)))  # 通常 ≥ 2(b自身、a中的引用)

del a  # 移除一个外部引用
print("After del a:", gc.collect())  # 返回 0 → 无回收(b 仍持引用)

del b  # 移除最后一个外部引用
print("After del b:", gc.collect())  # 返回 2 → 成功回收 a 和 b(循环不可达)

⚠️ 关键注意事项:

  • b 不保存 a 的副本:b = [a, a] 是将 a 的对象引用存入列表,而非深拷贝。因此 a 和 b[0]、b[1] 指向同一列表对象。
  • 动态修改 a 不影响 b 的引用有效性:a.append(b) 只是向 a 添加一个新元素(即 b 的引用),b 中原有对 a 的引用依然有效——它们共同维持循环。
  • GC 不是实时的:即使删除全部外部变量,回收也需显式调用 gc.collect() 或等待自动触发(取决于代阈值)。默认启用,但可禁用(不推荐)。
  • 不可达循环 ≠ 立即回收:GC 仅在“不可达”前提下工作。只要存在任意一条从根对象(如全局变量、栈帧局部变量)出发的引用路径,对象就安全存活。

? 总结:Python 的垃圾回收是安全、延迟、基于可达性分析的。理解 a 和 b 的引用关系本质(共享对象 vs 复制对象)、区分“有循环”和“不可达循环”,是掌握其行为的核心。日常开发中无需手动干预 GC,但对长期运行的服务或资源敏感场景,可结合 gc.set_debug() 跟踪回收行为,或使用 weakref 打破非必要循环。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

3725

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1530

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

4667

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2128

2023.08.10

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

578

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1476

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

2024

2025.09.12

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn