在Python中检测递归嵌套列表

hon*_*gsy 4 python

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

>>> a = [1,2]
>>> a += [a]
Run Code Online (Sandbox Code Playgroud)

一些属性:

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

打印时会发生什么a?这出现:

>>> a
[1, 2, [...]]
Run Code Online (Sandbox Code Playgroud)

同理:

>>> a[2]
[1, 2, [...]]
Run Code Online (Sandbox Code Playgroud)

为什么?Python如何"知道"列表中的递归?如何检测到递归?

Dun*_*can 10

当Python构造repr内置对象时,例如list它使用两个内部函数:Py_ReprEnter(PyObject *)Py_ReprLeave(PyObject *).

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

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