Python: 修改一个字典中的值会改变另一个字典

Python: modifying a value in one dictionary changes another dictionary

我正在 Python 上使用字典制作国际象棋程序,为了设置我的棋盘,我这样做:

EmptyBoard = {
    8:['☐','☒','☐','☒','☐','☒','☐','☒'],
    7:['☒','☐','☒','☐','☒','☐','☒','☐'],
    6:['☐','☒','☐','☒','☐','☒','☐','☒'],
    5:['☒','☐','☒','☐','☒','☐','☒','☐'],
    4:['☐','☒','☐','☒','☐','☒','☐','☒'],
    3:['☒','☐','☒','☐','☒','☐','☒','☐'],
    2:['☐','☒','☐','☒','☐','☒','☐','☒'],
    1:['☒','☐','☒','☐','☒','☐','☒','☐'],
    ' ':['⒜','⒝','⒞','⒟','⒠','⒡','⒢','⒣']
    }   #regular letters aren't wide enough

Default = {
    8:['♜','♞','♝','♛','♚','♝','♞','♜'],
    7:['♟','♟','♟','♟','♟','♟','♟','♟'],
    2:['♙','♙','♙','♙','♙','♙','♙','♙'],
    1:['♖','♘','♗','♕','♔','♗','♘','♖']
    }

Board = {}

def NewGame():
    Board.update(EmptyBoard)
    Board.update(Default)
    # some more code

NewGame()

这很好,直到我必须像这样编辑 Board 中的块:

Board[3][2] = "X"
print(EmptyBoard[3][2]) # ==> Results in 'X', should stay '☐' or '☒'

这会同时更改 Board[x][y] 以及 EmptyBoardDefault[x][y] 恰好位于其中的任何一个。

这会克隆棋子在第一次移动后的每一步。

如何才能只编辑 Board

DefaultEmptyBoard 都是从某物到列表的字典。当您在 NewGame 中调用 update 时,您将 Board[3](例如)设置为引用与 EmptyBoard[3] 完全相同的列表。那么,如果你这样写:

Board[3][4] = X

您更改该列表 - BoardEmptyBord(或 BoardDefault)共享。

要修复它,请使用 deepcopy

import copy

def NewGame():
    Board.update(copy.deepcopy(EmptyBoard))
    Board.update(copy.deepcopy(Default))
    ...

还有一件事 - 惯例是 python 中的变量以小写字母开头。