多维python列表元素分配错误

时间:2018-06-27 23:01:59

标签: 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] [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]]

2 个答案:

答案 0 :(得分:0)

您的代码说self.board[n] = rows是一个对象。为了节省内存,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

答案 1 :(得分:0)

首先使用一些工作代码:

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))

为什么这样做有效,而不是您编写的内容?因为,当您创建rows = [0 for _ in range m]并将其传递给不同的电路板时,它只是多次将同一对象传递给两个电路板。因此,而不是您的董事会

[rows1, rows2, rows3]

他们是

[rows, rows, rows]

由于它引用的是同一对象,因此在修改其中一个对象时,会得到相同的值。