多维python列表元素分配错误

多维python列表元素分配错误,python,oop,matrix,multidimensional-array,Python,Oop,Matrix,Multidimensional Array,我定义了一个维度为n,m的类游戏。init方法创建两个棋盘,每个玩家一个 class game: def __init__(self, n, m): rows = [0 for _ in range m] self.board1 = [rows for _ in range n] self.board2 = [rows for _ in range n] 当我给board1[0][0]赋值时,它也给board1[1][0]、board1[2][0]、…board1[n

我定义了一个维度为n,m的类游戏。init方法创建两个棋盘,每个玩家一个

class game:

def __init__(self, n, m):
    rows = [0 for _ in range m]
    self.board1 = [rows for _ in range n]
    self.board2 = [rows for _ in range n]
当我给board1[0][0]赋值时,它也给board1[1][0]、board1[2][0]、…board1[n][0]以及board2[0-n][0]赋值

比如说,

game(3,4)
game.board1[0][0] = 1
print("board 1: {}\nboard 2: {}).format(self.board1, self.board2))
返回

board 1: [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
board 2: [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]

您的代码表示,
self.board[n]=行,这是一个对象。为了节省内存,python不会复制它可以引用的对象。您可以使用
id(obj)
命令查看它们是否都引用了完全相同的对象

In [34]: id(game.board1[0])
Out[34]: 4439424520

In [35]: id(game.board1[1])
Out[35]: 4439424520

In [36]: id(game.board2[1])
Out[36]: 4439424520

首先是一些工作代码:

class game:

def __init__(self, n, m):
    self.board1 = [ [0]*m for _ in range(n) ]
    self.board2 = [ [0]*m for _ in range(n) ]

new_game = game(3,4)
new_game.board1[0][1] = 1
print("board 1: {}\nboard 2: {}".format(new_game.board1, new_game.board2))
为什么这是有效的,而不是你写的?因为,当您创建
行=[0 for uuu in range m]
并将其传递给不同的板时,它只是将同一对象多次传递给两个板。所以,你的董事会

[rows1, rows2, rows3]
是的

[rows, rows, rows]

因为它引用的是同一个对象,所以当您修改其中一个对象时,会得到相同的值

内部维度只是指向
行的链接,在每次迭代中,这些行不会被复制,而是被引用。它们会改变,因为所有列表项都引用了相同的支持对象。谢谢,我想这可能就是原因,但我不知道如何生成其他的板。谢谢你!!啊,好吧,我以为是这样的,但我不知道我可以用id()来确认。非常感谢。我决定把我在CodeWars上做的一个kata变成一个练习oop的类。这很好学