Python嵌套列表(二维数组)引用

时间:2020-02-06 08:39:19

标签: python arrays list nested 2d

看我的代码...为什么我的第一个嵌套列表(grid1)与第二个嵌套列表(grid2)不同?为什么利用率不同? 对于游戏,我想要一个4 x 6网格,每个元素的值都为'x',除grid [0] [0]之外,还要将其分配给'O'。这适用于 grid2 ,但不适用于 grid1 。为什么引用和列表看起来相同,但又有所不同?

#setup grid1 (4x6 2D nested list) populating x's in all positions
grid1 =[["x"]*4]*6]

grid1[0][0]="O"      #assign row 1, column 1 'O'
print(grid1)         

输出

[['O', 'x', 'x', 'x'], ['O', 'x', 'x', 'x'], ['O', 'x', 'x', 'x'], ['O', 'x', 'x', 'x'], ['O', 'x', 'x', 'x'], ['O', 'x', 'x', 'x']]

但此实现...

grid2 = []  
for row in range(0,6):
    grid2.append([])
    for column in range(0,4):
        grid2[row].append("x")

grid2[0][0]="O"

print(grid2)

正确输出

[['O', 'x', 'x', 'x'], ['x', 'x', 'x', 'x'], ['x', 'x', 'x', 'x'], ['x', 'x', 'x', 'x'], ['x', 'x', 'x', 'x'], ['x', 'x', 'x', 'x']]

有什么区别?为什么有区别?

2 个答案:

答案 0 :(得分:0)

对于第[[“” x“] * 4] * 6行中的grid1来说,'* 6'操作将创建一个包含六个[” x“,” x“,” x“,” x“的列表],但参考相同。 这意味着更改六个[“ x”,“ x”,“ x”,“ x”]中的任何一个都将更改其他的,因为它们引用内存中的同一对象。

您可以构建自己的列表类,该类将覆盖 mul ()以在列表乘法期间先深层复制列表。

答案 1 :(得分:0)

您可以使用列表理解:

grid3 = [ ["x"] * 4 for i in range(4) ]
grid3[0][0]="O"
print(grid3)

以更简洁的方式实现您的目标。

相关问题