看我的代码...为什么我的第一个嵌套列表(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']]
有什么区别?为什么有区别?
答案 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)
以更简洁的方式实现您的目标。