多维列表,在一个子列表中的变化反映在其他子列表中

时间:2016-10-25 21:46:19

标签: python list

我有一个如下数组,我想改变第二行中间条目的值。

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

为什么这不起作用?我如何只更改我想要的条目的值?

谢谢!

2 个答案:

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