python中错误赋值的二维列表

2024-09-27 21:29:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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-4python控制台演示/游戏时,遇到了一个非常奇怪的问题。在

以上代码的输出如下:

^{pr2}$

奇怪的是,我从来没有把O分配给所有这些位置,我只把它分配到位置[1][1]。在

我原以为结果是:

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

很有可能我遗漏了一些明显的小问题,但我已经找了一个多小时了,我真的找不到问题。在

它不像我的董事会列表比任何其他二维列表都要奇怪。在

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

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

复制并粘贴到IDLE中,我得到以下结果:

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

这给了我合适的董事会价值。在

我的代码有什么明显的错误以至于我忽略了它?我敢肯定,当你们中的任何人找到一个答案,我会羞愧地摇头,这很可能是那么糟糕。在

我的代码board.board[1][1] = "O"为什么要给board.board中的每一行赋值“O”?在

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


Tags: 代码inselfboardforlendefline
2条回答

这是python使用引用的问题。CreateBoard的第二部分

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

在外部列表中放置了7个对同一列表的引用。所以你有一个7份相同清单的清单。编辑其中一个子列表中的值实际上会更新所有子列表,因为它们引用的是相同的内存。在

一种选择是使用复制.deepcopy,或显式为每个列表创建一个新的行

^{pr2}$

或者

for i in range( 7 ):
    board.append( list(' ' * 7) )

这在常见问题解答的How do I create a multidimensional list下有解释?在

问题在于代码的这一部分:

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

您正在创建一个包含7个对同一列表的引用的列表,line。所以,当你修改一个时,其他的都会改变,因为它们是同一个列表。在

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

^{pr2}$

或者,更简单地说,将原始列表单独复制:

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]简单多少,但是{}访问第二列要比[row[1] for row in a]简单得多。在

相关问题 更多 >

    热门问题