将列表分配给该列表中的一个值

时间:2011-11-20 12:31:13

标签: python

我在理解列表的行为时遇到了一些问题。

我的运动问题是: 绘制一个显示以下语句效果的内存模型:

values = [0, 1, 2]
values[1] = values

我的想法是执行这些语句会将列表更改为此类[0, [0, 1, 2], 3] 换句话说,第二个语句会将第二个值附加到列表中(1),但是当我执行这些语句然后在Python shell(3.2)中打印出列表时,我得到以下结果:

[0, [...], 2]

第二次进入时发生了一些事情,但我不确定究竟是什么,有人可以解释发生了什么事吗?

谢谢你, 达米安

3 个答案:

答案 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)

适合你的那个是:

values = [0, 1, 2]
values[1] = values[:] # or list(values)

有关复制列表和参考的详细信息,请参阅here