我想创建一个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
这感觉多余,我想知道是否有更好的方法来初始化嵌套列表。
答案 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]]