无法从python按对象传递引用中转义

无法从python按对象传递引用中转义,python,object,Python,Object,我正在做一个国际象棋游戏,有一个计算所有合法移动的类函数。它通过将一个棋子作为参数来实现,并获得所有可能的攻击动作。然后,它循环这些动作,并暂时移动棋子,以查看该动作是否使其自身处于受控状态,如果是,则该动作不合法: def calculate_legal_moves(self, piece): """Get all the legal moves of a piece and returns them""" legal_moves = [] if not isinsta

我正在做一个国际象棋游戏,有一个计算所有合法移动的类函数。它通过将一个棋子作为参数来实现,并获得所有可能的攻击动作。然后,它循环这些动作,并暂时移动棋子,以查看该动作是否使其自身处于受控状态,如果是,则该动作不合法:

def calculate_legal_moves(self, piece):
    """Get all the legal moves of a piece and returns them"""
    legal_moves = []
    if not isinstance(piece, Pawn):
        possible_legal_moves = self.get_attacking_moves(piece)
        for move in possible_legal_moves:
            if isinstance(self.board[move[0]][move[1]], Piece):
                if not piece.colour == self.board[move[0]][move[1]].colour:
                    possible_board = self.preliminary_move_piece(self.board, piece.position, move)
                    if not self.is_in_check(piece.colour, possible_board):
                        legal_moves.append(move)
            else:
                possible_board = self.preliminary_move_piece(self.board, piece.position, move)
                if not self.is_in_check(piece.colour, possible_board):
                    legal_moves.append(move)
    else:
        if piece.colour == "White":
            legal_moves.append([piece.position[0]-1, piece.position[1]])
            if piece.position[0] == 6:
                legal_moves.append([piece.position[0]-2, piece.position[1]])
        else:
            legal_moves.append([piece.position[0]+1, piece.position[1]])
            if piece.position[0] == 1:
                legal_moves.append([piece.position[0]+2, piece.position[1]])
    return legal_moves

def preliminary_move_piece(self, chess_board, old_coords, new_coords):
    chess_board[new_coords[0]][new_coords[1]] = self.board[old_coords[0]][old_coords[1]]
    chess_board[old_coords[0]][old_coords[1]] = 0
    if isinstance(chess_board[new_coords[0]][new_coords[1]], Piece):
        chess_board[new_coords[0]][new_coords[1]].position = [new_coords[0], new_coords[1]]
    return chess_board

问题是,我传入了电路板的实例(一个2d数组)并临时移动了一块,以查看这是否使他处于检查状态,但是它似乎通过引用传递了实例变量,因此实际上永久地更改了块的位置,因此当我点击它时,我的块自动移动到最后一个可能的合法移动。有没有一种方法可以让我在使用premial_move_piece函数时保持实例变量(self.board)不变

因为列表在python中是可变的,所以它通过引用传递给函数。你可以:
a) 将其转换为tuple:
tuple(您的\u列表)
,因为tuple是不可变的,并按值传递
b) 将您的列表复制到其中一个,例如:
copied_list=您的_list[:]
关于同一个问题的非常相似的问题:

由于列表在python中是可变的,所以它通过引用传递给函数。你可以:
a) 将其转换为tuple:
tuple(您的\u列表)
,因为tuple是不可变的,并按值传递
b) 将您的列表复制到其中一个,例如:
copied_list=您的_list[:]
关于同一个问题的非常相似的问题:

列表在python中是可变的。可变对象的参数始终通过引用传递。有没有可能制作一个棋盘副本,并将副本传递给预备棋盘?这是我试图做的,但没有成功(原始棋盘=self.board)。然而,当我回到家时,我会尝试所有这些建议,如果可能的话,原始董事会=self.board会将原始董事会作为self.board的参考。我的意思是创建一个新列表,并将self.board的每个元素复制到其中。原始的_board=[[x代表x在y中]代表y在self.board]列表在python中是可变的。可变对象的参数始终通过引用传递。有没有可能制作一个棋盘副本,并将副本传递给预备棋盘?这是我试图做的,但没有成功(原始棋盘=self.board)。然而,当我回到家时,我会尝试所有这些建议,如果可能的话,原始董事会=self.board会将原始董事会作为self.board的参考。我的意思是创建一个新列表,并将self.board的每个元素复制到其中。我不认为我可以尝试一个元组,但如果可以的话,我会晚一点再看,但我真的不知道为什么b)不起作用,因为我以前一直在尝试,现在它还在复制。它是一个类变量和函数,这就是它自动复制的原因,因为如果我必须转换为元组,那么我必须重构很多数据cocde@user2867973在这种情况下,只需将传入列表复制到函数中(请参阅答案中的链接以检查如何执行)。例如,您可以使用我提到的示例或导入副本并制作
copy.copy(传入列表)
谢谢,我只想为以后阅读的其他人做一个笔记,我只需要copy.deepcopy()对我有效,我不知道为什么,也许有人可以评论为什么会这样。@user2867973,是的,deepcopy在这里是正确的,我的错。不同之处在于,
copy
复制列表,但如果列表的元素也是可变对象(列表或dict),则它不会进行复制,而是进行引用。Deepcopy完全复制了所有内容。我不认为我可以尝试一个元组,但如果可以的话,我会晚一点再看,但我确实不知道为什么b)不起作用,因为我之前一直在尝试,现在它还在复制。它是一个类变量和函数,这就是它自动复制的原因,因为如果我必须转换为元组,那么我必须重构很多数据cocde@user2867973在这种情况下,只需将传入列表复制到函数中(请参阅答案中的链接以检查如何执行)。例如,您可以使用我提到的示例或导入副本并制作
copy.copy(传入列表)
谢谢,我只想为以后阅读的其他人做一个笔记,我只需要copy.deepcopy()对我有效,我不知道为什么,也许有人可以评论为什么会这样。@user2867973,是的,deepcopy在这里是正确的,我的错。不同之处在于,
copy
复制列表,但如果列表的元素也是可变对象(列表或dict),则它不会进行复制,而是进行引用。Deepcopy完全复制所有文件。