问题一:列表 self append 无限嵌套的原理
先来回答第一个问题,两个同学都问到了,下面这段代码中的 x,为什么是无限嵌套的列表?
x = [1]
x.append(x)
x
[1, [...]]
我们可以将上述操作画一个图,便于你更直观地理解:
这里,x 指向一个列表,列表的第一个元素为 1;执行了 append 操作后,第二个元素又反过来指向 x,即指向了 x 所指向的列表,因此形成了一个无限嵌套的循环:[1, [1, [1, [1, …]]]]。
不过,虽然 x 是无限嵌套的列表,但 x.append(x) 的操作,并不会递归遍历其中的每一个元素。它只是扩充了原列表的第二个元素,并将其指向 x,因此不会出现 stack overflow 的问题,自然不会报错。
至于第二点,为什么 len(x) 返回的是 2?我们还是来看 x,虽然它是无限嵌套的列表