这两个2d阵列有什么区别?

Joh*_*ohn 2 python arrays syntax multidimensional-array

我正在编写一个需要二维数组的程序,并遇到了一个奇怪的问题.

起初,我写道:

board = [[]]*11
Run Code Online (Sandbox Code Playgroud)

在数组中创建十一个数组.

然后我想在每个数组中有十一个空格,所以我写道:

for i in range(11):
    board[i].append(' ')
Run Code Online (Sandbox Code Playgroud)

我想用星号填充第三个数组,从索引4到7,所以我写道:

for i in range(4, 7):
    board[2][i] = '*'
Run Code Online (Sandbox Code Playgroud)

但出乎意料的是,代替只有第三个数组受到代码的影响,"board"中的所有数组都被更改了.

当然,我写道:

board2 = []
for i in range(11):
    board2.append([])
Run Code Online (Sandbox Code Playgroud)

创建我的数组,然后写道:

for i in range(11):
    for i in range(11):
        board2[i].append(' ')
Run Code Online (Sandbox Code Playgroud)

用11个包含11个空格的数组创建我的数组.

在我创建了这样的数组后,我能够运行代码来添加星星,并且正如预期的那样,只影响了一个数组而不是所有数组.

有人可以解释这两个看似相似的数组有什么区别吗?

Mar*_*ers 7

该列表[[]] * 11包含对同一列表的 11个引用.

第二个示例创建了11个不同的列表.

board = [[]]*11
#        ^^ this is called just once

board2 = []
for i in range(11):
    board2.append([])
#                 ^^ this is called 11 times, creating 11 different lists
Run Code Online (Sandbox Code Playgroud)

编写第二个示例的另一种方法是使用列表解析:

[[] for i in range(11)]
Run Code Online (Sandbox Code Playgroud)