Python 将列表指定给该列表中的一个值

Python 将列表指定给该列表中的一个值,python,Python,我在理解列表的行为方面有点问题 我的练习问题是: 绘制一个内存模型,显示以下语句的效果: 我的想法是,执行这些语句会将列表更改为如下内容 ,换句话说,第二条语句将在列表(1)中附加第二个值,但当我执行这些语句,然后在Python shell(3.2)中打印列表时,我得到以下结果: [0, [...], 2] 第二次进入时发生了一些事情,但我不确定到底发生了什么,有人能解释一下发生了什么吗 谢谢,, 达米安你实际上是在把一个列表插入它自己。结果列表无法再打印,因为它有点像一个圆圈: values

我在理解列表的行为方面有点问题

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

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

[0, [...], 2]
第二次进入时发生了一些事情,但我不确定到底发生了什么,有人能解释一下发生了什么吗

谢谢,,
达米安

你实际上是在把一个列表插入它自己。结果列表无法再打印,因为它有点像一个圆圈:

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]

因此,
[…]
意味着列表包含自身。

您已经创建了一个递归数据结构。列表中的第二个元素是对列表本身的引用。当你打印出来时,通常你会希望看到原来的列表在第二位,正如你在问题中所建议的那样

但是,您插入的不是原始列表的副本,而是对实际列表的引用。因此,第二个元素必须打印出整个列表。但是,第二个元素的第二个元素本身就是对列表的引用,所以当它打印第二个元素时。。。。Python通过显示
[…]
优雅地处理这个问题,因为唯一的其他解决方案是呈现一组无限的嵌套列表

想象一下:在分配给
值[1]
之后,您的列表可以被认为是这样的:

[0, <pointer to itself>, 2]
[0,2]
当然,
打印出来时,看起来像:

[0, <pointer to itself>, 2]
[0,2]
当你把这些放在一起,你会得到:

[0, [0, <pointer to itself>, 2], 2]
[0,0,2,2]
但当然,要打印最里面的
也必须打印:

[0, [0, [0, <pointer to itself>, 2], 2], 2]
[0,0,2,2,2]

。。。等等一直以来都是海龟。

适合你的是:

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

有关复制列表和参考资料的更多信息,请参阅。

@Bryan Oakley,感谢您的回答,这是一个很好的解释。这一切归结为参考/复制,我需要更加警惕。我反对投票,因为这并不能回答问题。问题不是如何在列表中存储列表副本。问题是,“解释当您将列表中的元素设置为对自身的引用时会发生什么”。这个答案没有提供任何解释,只是一个解决办法。虽然你所说的是非常有用的建议,但在这个问题的上下文中却没有用。@布赖恩·奥克利:虽然它没有回答最初的问题,但这是唯一一个真正告诉你如何去做的条目,因为这种务实的方法绝对值得投票。
values = [0, 1, 2]
values[1] = values[:] # or list(values)