在Python中初始化一个m x n的0数组

时间:2017-05-26 06:52:29

标签: python

我想创建一个0 x m x n维的嵌套数组。我将遍历数组并稍后分配值。

如果我这样做:

l = [[0] * 3] * 3
for i in range(3):
    for j in range(3):
        if i == 0:
            l[i][j] = 1

我的条件似乎不适用,并且无论i如何,每个值都会分配给列表。我知道问题是由第一行代码中的0列表复制引起的。所以我把这样的内部列表分成几片来修复它:

l = [[0] * 3] * 3
for i in range(3):
    l[i] = l[i][:]
    for j in range(3):
        if i == 0:
            l[i][j] = 1

这感觉多余,我想知道是否有更好的方法来初始化嵌套列表。

1 个答案:

答案 0 :(得分:0)

你的问题是python中的列表是mutable,当使用*复制它们时,实际上是将引用复制到同一个列表,而不是创建新列表。

>>> l = [[0]*3]*3
>>> l
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> l[0][0] = 1
>>> l
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]

您希望通过单独创建主题来使列表与众不同:

>>> l = [[0 for _ in range(3)] for _ in range(3)]  # each list created by it own, and not as you did when it just a copy to the reference to the same list.
>>> l[0][0] = 1
>>> l
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]