python中二维列表错误赋值

2024-02-12

class Board:

    def __init__(self):
        self.board = self.createBoard()

    def createBoard(self):
        line = []
        for i in range(7):
            line.append(' ')
        board = []
        for i in range(7):
            board.append(line)
        return board

    def showBoard(self):
        line = "| "
        for x in range(len(self.board)):
            for y in range(len(self.board)):
                line += self.board[x][y] + " | "
            print("-" * 29)
            print(line)
            line = "| "
        print("-" * 29)

if __name__ == '__main__':
    board = Board()
    board.showBoard()
    board.board[1][1] = "O"
    board.showBoard()

当我遇到这个非常奇怪的问题时,我正在开发 connect-4 python 控制台演示/游戏。

上面代码的输出如下:

-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------

奇怪的是,我从未分配过O对于所有这些位置,我只将其分配给位置 [1][1]。

我原以为输出是:

-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------

我很可能遗漏了一些明显的小东西,但我已经寻找并尝试了一个多小时,但我确实找不到问题。

我的 board.board 列表并不比任何其他二维列表更奇怪。

[[' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ']]

(这就是我得到的,当我print(board.board))

将其复制并粘贴到 IDLE 中我得到以下内容:

>>> a = [[' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ']]
>>> a[1][1] = "O"
[[' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', 'O', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ']]

这让我得到了正确的董事会价值。

我的代码中有什么明显错误以至于我错过了它?我很确定,当你们中的任何一个人找到我会羞愧地摇头的答案时,情况可能就那么糟糕。

自羞得够多了,为什么我的代码board.board[1][1] = "O"将值“O”分配给中的每一行board.board?

将第一个 1 更改为 0-6 之间的任何其他数字也不会改变任何内容。全部都是一样。


常见问题解答中对此进行了解释,如下如何创建多维列表 http://docs.python.org/3.3/faq/programming.html#how-do-i-create-a-multidimensional-list?

问题出在这部分代码中:

board = []
for i in range(7):
    board.append(line)

您正在创建一个列表,其中包含对同一列表的 7 个引用,line。因此,当您修改其中一项时,其他项都会更改,因为它们是相同的列表。

解决方案是创建 7 个单独的列表,如下所示:

def createBoard(self):
    board = []
    for i in range(7):
        line = []
        for i in range(7):
            line.append(' ')
        board.append(line)
    return board

或者,更简单地,制作原始列表的单独副本:

def createBoard(self):
    line = []
    for i in range(7):
        line.append(' ')
    board = []
    for i in range(7):
        board.append(line[:])
    return board

当我们这样做时,您可以通过使用列表推导式来极大地简化它:

def createBoard(self):
    return [[' ' for j in range(7)] for i in range(7)]

或者,正如常见问题解答所建议的那样,您可能会更好地使用更智能的多维数组对象,例如 numpy 或 pandas 提供的对象:

def createBoard(self):
    return np.tile(' ', (7, 7))

缺点是你需要安装 numpy,因为标准库中没有任何东西可以像这样工作。但优点是你有强大的工具来处理数组——a[1, 1]并不比简单多少a[1][1], but a[:,1]访问第二列比[row[1] for row in a].

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中二维列表错误赋值 的相关文章

随机推荐