这两种初始化数组的方法有什么区别?

时间:2012-07-05 00:10:57

标签: python list initialization

matrix = [[0]*1005]*1005

matrix = [[0 for _ in range(1005)] for _ in range(1005)]

我发现如果我使用前者来初始化数组,并运行matrix[1][1] = 1它会将每行中的第二列设置为1.而第二列按照我的意愿执行。我想不通为什么?

2 个答案:

答案 0 :(得分:8)

[[0] * 1005] * 1005将为具有1005个零的数组创建一个包含1005个引用的数组。它们都是相同的参考,因此更改一个将改变所有其他参考。不过,您可以将工作代码缩短到此:

matrix = [[0] * 1005 for _ in range(1005)]

这几乎是任何人给你的关于列表乘法语法的唯一警告,实际上:)

答案 1 :(得分:3)

只是为了扩展已经说过的事情

a = [[0]] * 5
print a # [[0], [0], [0], [0], [0]]
a[0][0] = 1
print a # [[1], [1], [1], [1], [1]]