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]
以及 EmptyBoard
和 Default
中 [x][y]
恰好位于其中的任何一个。
这会克隆棋子在第一次移动后的每一步。
如何才能只编辑 Board
?
Default
和 EmptyBoard
都是从某物到列表的字典。当您在 NewGame
中调用 update
时,您将 Board[3]
(例如)设置为引用与 EmptyBoard[3]
完全相同的列表。那么,如果你这样写:
Board[3][4] = X
您更改该列表 - Board
和 EmptyBord
(或 Board
和 Default
)共享。
要修复它,请使用 deepcopy
:
import copy
def NewGame():
Board.update(copy.deepcopy(EmptyBoard))
Board.update(copy.deepcopy(Default))
...
还有一件事 - 惯例是 python 中的变量以小写字母开头。
我正在 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]
以及 EmptyBoard
和 Default
中 [x][y]
恰好位于其中的任何一个。
这会克隆棋子在第一次移动后的每一步。
如何才能只编辑 Board
?
Default
和 EmptyBoard
都是从某物到列表的字典。当您在 NewGame
中调用 update
时,您将 Board[3]
(例如)设置为引用与 EmptyBoard[3]
完全相同的列表。那么,如果你这样写:
Board[3][4] = X
您更改该列表 - Board
和 EmptyBord
(或 Board
和 Default
)共享。
要修复它,请使用 deepcopy
:
import copy
def NewGame():
Board.update(copy.deepcopy(EmptyBoard))
Board.update(copy.deepcopy(Default))
...
还有一件事 - 惯例是 python 中的变量以小写字母开头。