我正在编写一个需要二维数组的程序,并遇到了一个奇怪的问题。
起初,我写道:
board = [[]]*11
在数组中生成11个数组。
然后我想在每个数组中有十一个空格,所以我写道:
for i in range(11):
board[i].append(' ')
我想用星号填充第三个数组,从索引4到7,所以我写道:
for i in range(4, 7):
board[2][i] = '*'
但是出乎意料的是,不是只有第三个数组受到代码的影响,“board”中的所有数组都被更改了。
当然,我写道:
board2 = []
for i in range(11):
board2.append([])
创建我的数组,然后写道:
for i in range(11):
for i in range(11):
board2[i].append(' ')
用11个包含11个空格的数组创建我的数组。
在我创建了这样的数组之后,我能够运行代码来添加星星,并且正如预期的那样,只影响了一个数组而不是所有数组。
有人可以解释两个看似相似的数组之间有什么区别吗?
答案 0 :(得分: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
编写第二个示例的另一种方法是使用列表解析:
[[] for i in range(11)]