使用嵌套循环创建2D数组

时间:2011-09-24 01:52:20

标签: python

以下代码

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]]

为什么?

3 个答案:

答案 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

另外(只回答“为什么?”),你正在使用乘法制作相同列表的副本,因此,修改其中一个将修改所有这些副本。