假设我在Python中创建一个递归嵌套的列表,就像这样:
>>> a = [1,2]
>>> a += [a]
一些属性:
len(a)
是3
a[2] is a
是True
当你打印出 a
时,会输出以下结果:
>>> a
[1, 2, [...]]
同样地:
>>> a[2]
[1, 2, [...]]
为什么?Python如何“知道”列表中的递归?递归是如何被检测出来的?
假设我在Python中创建一个递归嵌套的列表,就像这样:
>>> a = [1,2]
>>> a += [a]
一些属性:
len(a)
是 3
a[2] is a
是 True
当你打印出 a
时,会输出以下结果:
>>> a
[1, 2, [...]]
>>> a[2]
[1, 2, [...]]
在Python构建内置对象(例如list
)的repr
时,它使用了两个内部函数:Py_ReprEnter(PyObject *)
和Py_ReprLeave(PyObject *)
。
这两个函数中的第一个检查我们是否已经处理了指定对象的 repr(即查看它当前是否正在记住该对象)。如果没有,它将记住该对象并返回0。在这种情况下,repr代码打印对象,然后调用Py_ReprLeave
,从当前正在跟踪的集合中删除该对象。
如果Py_ReprEnter
已经跟踪该对象,则返回非0,在这种情况下,列表repr代码会打印[...]
。