我正在定义尺寸为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]]
答案 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]
由于它引用的是同一对象,因此在修改其中一个对象时,会得到相同的值。