首页 > 解决方案 > 对 list.copy() 所做的修改适用于列表

问题描述

我正在尝试使用面向对象的编程在 python 3 中为国际象棋游戏建模。我正在使用的一个类是 Board,它包含一个矩阵(8x8 列表列表)和另一个对象。我还创建了一个简单的__str__方法来可视化棋盘。

这是 Board 类定义的一部分:

class Board:
    def __init__(self, pieces: list):
        self.container = [[pieces[i] for i in range(8)],  # Whites
                          [pieces[i] for i in range(8, 16)],  # White pawns
                          [None] * 8,
                          [None] * 8,
                          [None] * 8,
                          [None] * 8,
                          [pieces[i] for i in range(16, 24)],  # Black pawns
                          [pieces[i] for i in range(24, 32)]]  # Blacks


    def __str__(self):
        str_copy = self.container.copy()

        for i in range(8):
            for j in range(8):
                if isinstance(str_copy[i][j], King):
                    str_copy[i][j] = 'K'
                elif isinstance(str_copy[i][j], Queen):
                    str_copy[i][j] = 'Q'
                elif isinstance(str_copy[i][j], Rook):
                    str_copy[i][j] = 'R'
                elif isinstance(str_copy[i][j], Knight):
                    str_copy[i][j] = 'N'
                elif isinstance(str_copy[i][j], Bishop):
                    str_copy[i][j] = 'B'
                elif isinstance(str_copy[i][j], Pawn):
                    str_copy[i][j] = 'P'
                elif str_copy[i][j] is None:
                    str_copy[i][j] = '_'

        return ''.join([str(line) + '\n' for line in str_copy])

我的问题是,在我的代码中的某个时间点Board.container似乎被str_copy. 我真的想不通为什么。如果您想查看它,这是完整的代码:pastebin

非常感谢你的帮助 !

标签: pythonlist

解决方案


这太复杂了。首先,每个部分都应该有自己的__str__方法,例如,

class Bishop:
    ...

    def __str__(self):
        return 'B'

然后

class Board:
    def __init__(self, pieces: list):
        self.container = [pieces[:8],  # white back row
                          pieces[8:16],  # white pawns
                          [None] * 8,
                          [None] * 8,
                          [None] * 8,
                          [None] * 8,
                          pieces[16:24],  # black pawns
                          pieces[24:32]   # black back row
                         ]

    @staticmethod
    def _square_to_str(x):
        return '_' if x is None else str(x)

    def __str__(self):
        return '\n'.join(''.join(map(Board._square_to_str, row))
                          for row in self.container)

推荐阅读