CPython的repr从哪个版本开始原生支持递归数据结构处理?
CPython互递归对象字符串表示的行为观测
早期Python版本运行以下互递归对象的最小可复现代码时,会因为循环引用触发无限递归,最终导致栈溢出:
class Ref: def __init__(self, name): self.name = name self.value = None def __repr__(self): if self.value is None: return self.name return f"{self.name}={self.value!r}" if __name__ == '__main__': x, y = Ref("x"), Ref("y") x.value = (1, y) y.value = (2, x) print(x) print(y)
在CPython 3.10.4环境中测试时,上述代码可以直接正常运行,不会触发栈溢出,输出带递归省略标记的结果如下:
x=(1, y=(2, x=(...))) y=(2, x=(1, y=(...)))
目前暂未查询到该行为的明确变更节点,结合实测和已有资料可得到以下结论:
- 截至2020年,公开技术社区中仍有大量关于自递归、互递归数据结构打印栈溢出的讨论,当时的主流解决方案均为开发者手动实现递归引用检测逻辑。
- 标准库内置的
reprlib模块早已支持输出...形式的递归省略结果,从实际运行表现判断,CPython核心开发团队已经将同类递归检测逻辑集成到了解释器默认的对象字符串表示流程中。 - 额外测试确认,
__str__方法同样具备相同的递归处理能力,说明该特性并非repr()调用独有。
内容的提问来源于stack exchange,提问作者Bruno Kim
相关产品推荐
相关产品推荐

