多维python列表元素分配错误
我定义了一个维度为n,m的类游戏。init方法创建两个棋盘,每个玩家一个多维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
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的类。这很好学