我在理解列表的行为时遇到了一些问题。
我的运动问题是: 绘制一个显示以下语句效果的内存模型:
values = [0, 1, 2]
values[1] = values
我的想法是执行这些语句会将列表更改为此类[0, [0, 1, 2], 3]
换句话说,第二个语句会将第二个值附加到列表中(1),但是当我执行这些语句然后在Python shell(3.2)中打印出列表时,我得到以下结果:
[0, [...], 2]
第二次进入时发生了一些事情,但我不确定究竟是什么,有人可以解释发生了什么事吗?
谢谢你, 达米安
答案 0 :(得分:13)
您已经创建了一个递归数据结构。列表中的第二个元素是对列表本身的引用。当你打印出来时,通常你会希望在你的问题中建议在第二位看到原始列表。
但是,您没有插入原始列表的副本,而是将引用插入到实际列表中。因此,第二个元素必须打印出整个列表。但是,第二个元素的第二个元素本身就是对列表的引用,所以当它打印它的第二个元素时,...... Python通过显示[...]
来优雅地处理它其他解决方案是提供一组无限的嵌套列表。
想象一下:在您分配到values[1]
后,您的列表可能会被视为如下所示:
[0, <pointer to itself>, 2]
当然,<pointer to itself>
在打印出来时看起来像是:
[0, <pointer to itself>, 2]
当你把它们放在一起时,你得到:
[0, [0, <pointer to itself>, 2], 2]
但是,当然,要打印最里面的<pointer to itself>
,也必须打印出来:
[0, [0, [0, <pointer to itself>, 2], 2], 2]
......等等。它一直是乌龟。
答案 1 :(得分:3)
您实际上是在插入一个列表。生成的列表不能再打印了,因为它有点圆了:
values = [0, 1, 2]
values[1] = values
# so the list now looks like
[0, values, 2]
# so we expand the variable and get
[0, [0, values, 2], 2]
# and so on
[0, [0, [0, values, 2], 2], 2]
# as this will never end instead Python prints
[0, [...], 2]
所以[...]
表示该列表包含自己。
答案 2 :(得分:0)