python中不受欢迎的列表赋值行为

Wil*_*nes 3 python list

当我执行以下命令时,我希望得到一个3x3矩阵(列表列表),其中所有单元格都为零,中央单元格为1.相反,我得到一个矩阵,其中[0] [1],[1] [1]和[2] [1]位置都是一个:

a = [[0]*3]*3
a[1][1] = 1
Run Code Online (Sandbox Code Playgroud)

这似乎表明矩阵中的所有单元格都指向同一个对象,这可以通过a[0] is a[1]返回"True" 的事实得到证实.实际上,a[0][0] is a[0][1]如果在上面的第二个表达式之前执行,也会返回"True".那么,为什么不是[0] [0],[0] [2]等(第一和第三"列"中的单元格)也用新值更新?

NPE*_*NPE 5

以下将满足您的期望:

a = [[0]*3 for i in range(3)]
Run Code Online (Sandbox Code Playgroud)

问题在于,在您的示例中,a最终引用相同列表的三个顶级元素,因此当您更改一行时a,所有其他行似乎也会更改.

我建议的代码通过为行的行创建三个单独的列表来进行更改a.