我制作了矩阵5x3
field = []
fields = []
for i in range(0,5):
for j in range(0,3):
x = 1
field.append(x)
fields.append(field)
当我想要更改一个字段时
fields[2][2] = 0
我明白了:
fields[0][0] = 1
fields[0][1] = 1
fields[0][2] = **0**
fields[1][0] = 1
fields[1][1] = 1
fields[1][2] = **0**
fields[2][0] = 1
fields[2][1] = 1
fields[2][2] = **0**
fields[3][0] = 1
fields[3][1] = 1
fields[3][2] = **0**
fields[4][0] = 1
fields[4][1] = 1
fields[4][2] = **0**
而是一个改变,我得到五个
答案 0 :(得分:2)
发生这种情况的原因是列表的每一行都引用了同一个对象,名为field
的列表。您可以通过查看每行的id
来查看此信息。你会发现:
id(fields[0]) == id(fields[1])
id(fields[0]) == id(fields[2])
等等。每一行实际上都是同一个对象。
您需要为每一行创建单独的列表:
fields = []
for i in range(0,5):
field = []
for j in range(0,3):
x = 1
field.append(x)
fields.append(field)
现在你会看到:
id(fields[0]) != id(fields[1])
等等。您尝试修改单个元素的行为将按照您的意图行事。
但实际上,如果你想使用矩阵,那么你应该使用numpy。
答案 1 :(得分:2)
因为您在所有行中都引用了相同的field
。
你想要这个:
for i in range(0,5):
field = []
for j in range(0,3):
x = 1
field.append(x)
fields.append(field)
应该为每一行重置 field
。这就是为什么你应该把它放在第一个循环中。现在你的fields[2][2] = 0
会有效。
>>> fields
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> fields[2][2] = 0
>>> fields
[[1, 1, 1], [1, 1, 1], [1, 1, 0], [1, 1, 1], [1, 1, 1]]