以下代码
n = 3
matrix = [[0] * n] * n
for i in range(n):
for j in range(n):
matrix[i][j] = i * n + j
print(matrix)
打印
[[6, 7, 8], [6, 7, 8], [6, 7, 8]]
但我期待的是
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
为什么?
答案 0 :(得分:3)
请注意:
>>> matrix = [[0] * 3] * 3
>>> [x for x in matrix]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> [id(x) for x in matrix]
[32484168, 32484168, 32484168]
>>>
三行但只有一个对象。
请参阅the docs,特别是关于s * n
操作的注释2。
修正:
>>> m2= [[0] * 3 for i in xrange(5)]
>>> [id(x) for x in m2]
[32498152, 32484808, 32498192, 32499952, 32499872]
>>>
更新:以下是一些代码示例简单地(即没有iter()
):
>>> nrows = 2; ncols = 4
>>> zeroes = [[0 for j in xrange(ncols)] for i in xrange(nrows)]
>>> zeroes
[[0, 0, 0, 0], [0, 0, 0, 0]]
>>> ap = [[ncols * i + j for j in xrange(ncols)] for i in xrange(nrows)]
>>> ap
[[0, 1, 2, 3], [4, 5, 6, 7]]
>>>
答案 1 :(得分:1)
之后尝试运行matrix[0][0] = 0
。请注意它现在变成:
[[0, 7, 8], [0, 7, 8], [0, 7, 8]]
所以它同时改变了这三个。
阅读本文:http://www.daniweb.com/software-development/python/threads/58916
这似乎可以解释它。
答案 2 :(得分:1)
>>> it = iter(range(9))
>>> [[next(it) for i in range(3)] for i in range(3)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
只需将3
替换为n
,将9
替换为n**2
另外(只回答“为什么?”),你正在使用乘法制作相同列表的副本,因此,修改其中一个将修改所有这些副本。