首页 > 编程问答 >为什么Python要对引用非容器类型的类型实现循环GC

为什么Python要对引用非容器类型的类型实现循环GC

时间:2024-07-29 13:15:43浏览次数:7  
标签:python garbage-collection circular-dependency python-c-api

检查文档: 支持循环垃圾收集

Python 对检测和收集涉及循环引用的垃圾的支持需要对象类型的支持 ,这些对象类型是其他对象的“容器”,这些对象也可能是容器 不存储对其他对象的引用或仅存储对原子类型(例如数字或字符串)的引用的类型不需要为垃圾收集提供任何显式支持。

但是我正在研究|的实现||,虽然 bytearray 本身不使用循环GC,但它创建的 bytearray 迭代器 却使用循环GC。 我的问题是,根据文档,它不需要它,因为 迭代器不引用任何可能是创建它的 bytearray 本身的容器的对象,因此没有循环依赖的机会。 这背后的原因是什么? bytearray itself that created it, hence no chance of cyclic dependency. What's the reason behind that?


你对 Python 垃圾回收文档的理解是正确的。 bytearray 迭代器不需要声明 Py_TPFLAGS_HAVE_GC ,因为它不创建任何涉及容器对象的循环引用。这看起来像是 CPython 中的一个小 bug 或不一致的地方。

可能的原因

  • 历史原因 : bytearray 迭代器的实现可能在过去需要循环垃圾回收,后来代码被简化了,但标志仍然存在。
  • 简化 : 为所有迭代器类型(包括那些不需要的)统一设置 Py_TPFLAGS_HAVE_GC 标志,可以简化垃圾回收器的实现。
  • 潜在的边缘情况 : 可能存在一些我们没有考虑到的边缘情况,其中 bytearray 迭代器可能会被其他容器对象引用,从而导致循环引用。

影响

这个多余的标志不太可能对性能或内存使用产生明显的影响。垃圾回收器仍然会正确地处理迭代器,无论标志是否存在。

建议

在 CPython 开发者邮件列表或错误跟踪器上报告这个问题可能是一个好主意。开发者可以提供更多关于这个特定设计选择的信息。

总的来说,这是一个有趣的发现!它表明,即使在像 CPython 这样成熟的代码库中,也可能存在一些小 bug 或不一致的地方。

标签:python,garbage-collection,circular-dependency,python-c-api
From: 78805476

相关文章

  • 如何在 Visual Studio Code 中降级终端中的 python?
    我有一段代码需要运行,但它仅与tensorflow1.3、1.4和1.5兼容。我想我需要降级python才能运行它,但是终端有python3.10我尝试创建虚拟环境失败,但终端仍然说它正在使用python3.10,所以我仍然无法运行代码有什么我可以做的吗?是对的,创建虚拟环境是运行不同Python版本代......
  • python-小李帮老师改错(赛氪OJ)
    [题目描述]老师给小理发了一封电子邮件,任务如下。写一个程序,给你 n 个数,输出 X。X=num1p1​​+num2p2​​+⋯+numnpn​​。                 num1​,num2​,⋯⋯,numn​ 都是整数,p1​,p2​,⋯⋯pn​ 都是一位数。但是出现了一些玄学错误,......
  • 保护从 py2exe python 生成的二进制文件
    我的项目需要将我的python文件转换为py2exe。公平地说,我的py2exe正在工作。假设我的二进制文件名为“test.exe”。我知道我的test.exe包含我的python文件的所有pyc文件。我想要做的是,保护我的text.exe,这样我的源代码就不会被看到,换句话说,我不希望它被反编译回来,我该怎......
  • python 将数字前面的字符替换为数字后面的新字符
    我有一些字符串看起来像:*.rem.1.gz和*.rem.2.gz我想将其替换为*.1.trim.gz和*.2.trim.gz1号文件和2号文件相互配对,我想创建一个单独的字符串来同时包含这两个文件。importosallfiles=os.listdirpair=[x.replace("rem.(\d+)","(\d+).trim")forxinall......
  • 使用python打开UNC文件
    如何使用python通过路径打开网络计算机上的文件?我当前正在使用os.startfile但随后出现错误winerror2:无法打开文件。文件路径是正确的,我可以通过win+R打开该文件。感谢您提供的任何帮助。importwin32wnetimportosdefopen_unc_path(unc_path,usern......
  • Python环境:深入理解与构建实践
    Python环境:深入理解与构建实践在当今的软件开发领域中,Python以其简洁的语法、丰富的库支持和广泛的应用场景,成为了众多开发者、数据科学家、机器学习工程师及自动化测试人员的首选语言。然而,要高效地使用Python进行项目开发,深入理解并合理构建Python环境是至关重要的。本文......
  • 界面自动化测试录制工具,让python selenium自动化测试脚本开发更加方便
    自动化测试中,QTP和seleniumIDE都支持浏览器录制与回放功能,简单的来说就像一个记录操作步骤的机器人,可以按照记录的步骤重新执行一遍,这就是脚本录制。个人觉得传统录制工具有些弊端,加上要定制支持我自己的自动化框架(python单机版自动化测试框架源代码),所以自己用javascript写了一个......
  • Python 面试常问问题及应用场景解析
    引言随着Python在数据科学、Web开发、自动化脚本、机器学习等领域中的广泛应用,越来越多的公司开始寻找具备Python技能的人才。因此,在Python面试中,面试官通常会通过一系列问题来评估应聘者的编程基础、问题解决能力和对Python特性的理解程度。本文将涵盖Python面试中最常见的......
  • python 虚拟环境
    python虚拟环境Python的venv模块允许你创建轻量级的“虚拟环境”,这些环境是独立的Python安装,用于项目的依赖隔离。每个虚拟环境都有自己的Python解释器、库和脚本,与系统中安装的Python相互隔离。这意呀着,你可以在一个项目中安装特定版本的库,而不会影响到系统上其他Pyt......
  • 使用 Azure Devops API (Python) 撰写 PR 评论
    在任何地方都找不到直接的方法。如何通过Python中的AzureDevopsAPI将注释添加到拉取请求?可以使用AzureDevOpsPythonAPI将注释添加到拉取请求。以下是执行此操作的方法:1.安装AzureDevOps库:pipinstallazure-devops2.导入必要的类并对的组......