Python中递归嵌套列表的检测

Python中递归嵌套列表的检测,python,Python,假设我在Python中创建一个递归嵌套列表,如下所示: >>> a = [1,2] >>> a += [a] 一些属性: len(a)is3 a[2]是一个isTrue 打印出a时会发生什么情况?这似乎是: >>> a [1, 2, [...]] 同样地: >>> a[2] [1, 2, [...]] 为什么??Python如何“知道”列表中的递归?递归是如何检测的?当Python构造内置对象(如列表)的repr时

假设我在Python中创建一个递归嵌套列表,如下所示:

>>> a = [1,2]
>>> a += [a]
一些属性:

  • len(a)
    is
    3
  • a[2]是一个
    is
    True
打印出
a
时会发生什么情况?这似乎是:

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

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

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

当Python构造内置对象(如
列表)的
repr
时,它使用两个内部函数:
Py_ReprEnter(PyObject*)
,和
Py_ReprLeave(PyObject*)

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


如果
Py_ReprEnter
已经在跟踪对象,它将返回非0,并且在这种情况下,list repr代码打印
[…]

的可能副本,我不太确定它是如何在Python中实现的,但是如果我要实现这一点,在遍历要打印的列表元素时,我会检查元素是否一致(在适当的意义上)对于我正在序列化的整个列表-如果是这样,我将只放省略号,而不是进入递归调用。@YassineFaris这个问题是不同的,但它不是问如何检测递归。请注意,Python 3还提供了一个装饰程序,帮助您自己的repr实现做到这一点: