我正在阅读《 Python完整版》参考书,在练习中有一个问题说要添加以下内容:
L=[1, 2]
L.append(L)
print (L)
作为回应,我得到这样的输出
[1, 2, 3, [...]]
但是在书中它提到直到您按下Break键,它才会无限地追加列表:如下: 连续不断的[1、2,[1、2,[1、2,[1、2等, 组合键
有人可以解释我在做什么错吗?
答案 0 :(得分:0)
程序实际上不是无限地追加列表(这意味着列表长度等于无穷大,这不是---如果您运行len(L),您将看到长度是3)。相反,它是无限递归。
该列表以两个元素1和2开头(我想您在输出中显示了“ 3”的错误,因为列表中从未添加3)。
然后,您告诉列表您希望第三个元素等于现有列表。但是,由于python如何传递数据,您实际上要做的是存储对列表L的引用。类似这样的东西:[1,2,ref(L)]。
然后当您打印列表时,前两个元素很容易出现:1、2。 但是,对于第三个元素,python表示“让我去获取列表L并显示它”。好吧,列表L是什么?它是[1,2,ref(L)]。嗯所以python再次说:“好吧,这第三个元素有点棘手。我知道它是长度为3的列表,我知道前两个元素是什么,但是我需要获取第三个元素,即列表L 。什么是列表L?...”,然后继续。
[...]表示永远无法完全定义第三个元素(L [2]),因为获取的每个ref(L)内都包含另一个ref(L)元素。
因此您的实际输出是这样的:
=> [1, 2, ref(L)]
=> [1, 2, [1, 2, ref(L)]]
=> [1, 2, [1, 2, [1, 2, ref(L)]]]
=> [1, 2, [1, 2, [1, 2, [1, 2, ref(L)]]]]
...
哪个python有帮助地将其截断为[1、2,[...]],以表明该模式会永远重复。