我有一个如下数组,我想改变第二行中间条目的值。
array = [[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]
array[1][1] = 1
预期产出:
[[0, 0, 0],
[0, 1, 0],
[0, 0, 0]]
然而,似乎整个列的值都改变了:
[[0, 1, 0],
[0, 1, 0],
[0, 1, 0]]
为什么这不起作用?我如何只更改我想要的条目的值?
谢谢!
答案 0 :(得分:0)
那是因为您没有按照问题中提到的方式创建数组。相反,您使用*
创建了它:
>>> [[0]*3]*3
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
在这种情况下,所有嵌套列表都指向list
的相同引用。更新列表中的任何值都将反映所有列表中的更改:
>>> array = [[0]*3]*3
>>> array[0][1] = 1 # updating 0th list
>>> array
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
# ^ ^ ^ all 1 indexes updated
>>> array[1][0] = 2 # updating 1st list
>>> array
[[2, 1, 0], [2, 1, 0], [2, 1, 0]]
# ^ ^ ^ all 0 indexes updated
要解决此问题,请创建array
之类的:
>>> [[0]*3 for _ in range(3)]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
在此列表上执行相同的操作集时,我得到:
>>> array = [[0]*3 for _ in range(3)]
>>> array[0][1] = 1
>>> array
[[0, 1, 0], [0, 0, 0], [0, 0, 0]]
# ^ Only one value updated as expected
>>> array[1][0] = 2
>>> array
[[0, 1, 0], [2, 0, 0], [0, 0, 0]]
# ^ again as expected
答案 1 :(得分:0)
当我这样做时,我得到预期的输出。
我认为问题很可能是你没有按照上面的方式声明你的阵列。我猜你猜你的阵列是这样的:
array = [[0, 0, 0]] * 3
这里发生的是你正在创建1个数组行,[0,0,0]并设置数组[0] =数组[1] =数组[2] = [0,0, 0]。由于它们都指向一行,如果您更改该行中的一个值,则该更改将在所有3行中显示。
如果使用列表推导初始化数组,则每次都创建一个新行,您将获得预期的输出:
array = [[0, 0, 0] for i in range(3)]