0

0

Python 对象引用循环如何产生

冰川箭仙

冰川箭仙

发布时间:2026-02-26 19:07:01

|

521人浏览过

|

来源于php中文网

原创

python对象引用循环指多个对象互相持有对方引用致引用计数无法归零,如父子节点互引;容器自引用、闭包嵌套、自定义__del__方法及弱引用使用不当均会加剧该问题,weakref可主动避免。

python 对象引用循环如何产生

Python 中的对象引用循环,通常发生在两个或多个对象互相持有对方的引用,导致它们的引用计数无法降为 0,从而在常规引用计数机制下无法被立即回收。

常见产生场景

最典型的是两个实例对象相互赋值属性:

  • 对象 A 的某个属性指向对象 B
  • 对象 B 的某个属性又指向对象 A
  • 此时即使外部所有变量都不再引用 A 和 B,它们仍彼此“拽着”对方

例如:

class Node:
    def __init__(self, name):
        self.name = name
        self.parent = None
        self.children = []
<p>a = Node("a")
b = Node("b")
a.children.append(b)  # a → b
b.parent = a           # b → a</p><h1>此时 a 和 b 构成引用循环</h1>

容器类型加剧循环风险

列表、字典、集合等容器对象容易隐式形成循环:

造次
造次

Liblib打造的AI原创IP视频创作社区

下载

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

  • 一个列表把自己作为自身某个元素(lst.append(lst)
  • 字典的键或值引用了包含它的对象(如类实例把自身存入自己的 __dict__
  • 闭包中嵌套函数引用了外层作用域的可变对象,而该对象又持有函数引用

自定义 __del__ 方法可能诱发循环

当对象定义了 __del__ 方法,且该对象参与了循环引用时,CPython 的垃圾回收器会将它加入“不可达但带 __del__”的特殊队列,延迟处理甚至不处理,进一步阻碍清理。

  • 这类对象不会被循环垃圾收集器自动释放,除非手动调用 gc.collect()
  • 若多个带 __del__ 的对象互引,还可能引发析构顺序不确定或异常抑制

弱引用可主动避免循环

对不需要“强持有”的关系,改用 weakref 模块:

  • weakref.ref(obj) 创建弱引用,不增加引用计数
  • weakref.WeakKeyDictionaryWeakValueDictionary 适合缓存场景
  • 在上面的父子节点例子中,让 parent 属性使用 weakref.ref 就能打破循环

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

147

2025.07.29

append用法
append用法

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

348

2023.10.25

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

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

1080

2023.11.14

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

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

178

2025.09.12

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

1

2026.02.26

Golang Web 开发路线:构建高效后端服务
Golang Web 开发路线:构建高效后端服务

《Golang Web 开发路线:构建高效后端服务》围绕 Go 在后端领域的工程实践,系统讲解 Web 框架选型、路由设计、中间件机制、数据库访问与接口规范,结合高并发与可维护性思维,逐步构建稳定、高性能、易扩展的后端服务体系,帮助开发者形成完整的 Go Web 架构能力。

3

2026.02.26

Golang 并发编程专题:掌握多核时代的核心技能
Golang 并发编程专题:掌握多核时代的核心技能

《Golang 并发编程专题:掌握多核时代的核心技能》系统讲解 Go 在并发领域的设计哲学与实践方法,深入剖析 goroutine、channel、调度模型与并发安全机制,结合真实场景与性能思维,帮助开发者构建高吞吐、低延迟、可扩展的并发程序,全面提升多核时代的工程能力。

5

2026.02.26

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

353

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

77

2026.02.25

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号