【问题标题】:multidimensional python list element assignment error多维python列表元素分配错误
【发布时间】:2018-06-27 23:01:58
【问题描述】:

我正在定义一个维度为 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]]

【问题讨论】:

  • 内部维度只是指向rows 的链接,它不会被复制,而是在每次迭代中引用。它们会发生变化,因为所有列表项都引用了相同的支持对象。

标签: python oop matrix multidimensional-array


【解决方案1】:

首先是一些工作代码:

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]

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

【讨论】:

  • 谢谢,我认为这可能是原因,但我不知道如何生成板子。谢谢!!
【解决方案2】:

您的代码说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

【讨论】:

  • 啊,好吧,我以为就是这样,但不知道我可以使用 id() 来确认它。谢谢!我决定把我在 CodeWars 上做的一个 kata 变成一个练习 oop 的课程。这个很好学
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 2019-08-13
  • 2021-09-22
  • 2013-02-25
  • 2020-08-08
  • 2020-07-25
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多