我正在一个编码网站上尝试一些问题,其中一个问题要求用户创建一个 n 大小的空嵌套列表。所以很自然地,我的第一个倾向就是像这样相乘:
list = [[0]*n]*n
但这不起作用,因为其余代码进入列表并更改了值,并且该解决方案出现了越界错误。 然而,下面的代码确实有效。
list = [[0]*n for _ in range (n)]
我想知道这是怎么回事。据我所知,IDLE 中的结果是相同的。
谢谢你
这是初学者面临的众所周知的陷阱。当在列表上使用
*
运算符时,对象引用会重复。没有制作该列表的副本。您可以通过在列表元素上执行 id()
来检查它。
第二段代码分别创建
n
列表。因此,每个对象都有自己独特的对象引用。
更新: 这在 Udacity 上被记录为第一个陷阱:https://www.udacity.com/wiki/common-python-pitfalls