在Python中检测递归嵌套列表

5

假设我在Python中创建一个递归嵌套的列表,就像这样:

>>> a = [1,2]
>>> a += [a]

一些属性:

  • len(a)3
  • a[2] is aTrue

当你打印出 a 时,会输出以下结果:

>>> a
[1, 2, [...]]

同样地:
>>> a[2]
[1, 2, [...]]

为什么?Python如何“知道”列表中的递归?递归是如何被检测出来的?

4
可能是 What is the ellipsis [...] in a Python list? 的重复问题。 - Yassine Faris
我不太确定在Python中如何实现,但如果我要实现这个功能,当迭代列表元素进行打印时,我会检查该元素是否与我正在序列化的整个列表(在适当的意义上)相符 - 如果是,则只需放置省略号而不是进入递归调用。 - Grisha
1
@YassineFaris 那个问题不同,它并不是在问如何检测递归。 - Alex Hall
请注意,Python 3 还提供了一个装饰器来帮助您自己实现 repr:https://docs.python.org/3/library/reprlib.html#reprlib.recursive_repr - Alex Hall
1个回答

11

在Python构建内置对象(例如list)的repr时,它使用了两个内部函数:Py_ReprEnter(PyObject *)Py_ReprLeave(PyObject *)

这两个函数中的第一个检查我们是否已经处理了指定对象的 repr(即查看它当前是否正在记住该对象)。如果没有,它将记住该对象并返回0。在这种情况下,repr代码打印对象,然后调用Py_ReprLeave,从当前正在跟踪的集合中删除该对象。

如果Py_ReprEnter已经跟踪该对象,则返回非0,在这种情况下,列表repr代码会打印[...]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接