看看我的代码...为什么我的第一个嵌套列表 (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']]
有什么区别以及为什么不同?
最佳答案
对于 [["x"]*4]*6 行中的 grid1,'*6' 操作创建一个包含六个 ["x","x","x","x"的列表] 但是相同的引用。 这意味着更改六个 ["x","x","x","x"] 中的任何一个都会更改其他对象,因为它们引用内存中的同一对象。
您构建自己的列表类,该类重写 mul() 以在列表乘法过程中深度复制列表。
关于Python嵌套列表(二维数组)引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60090746/