我有一个'GameBoard'课,正在搜索它。我想将当前游戏板保存在列表中,更改游戏板的状态,将其保存在列表中等等(所以我会在游戏进程中增加游戏板的版本)。
我目前正在使用copy.deepcopy执行此操作,但它似乎并没有保存并继续前进。以下是我的代码示例:
moves = [] # just for reference. this has at least one value in it by the time the while loop hits.
while winner is False and len(moves) > 0:
g_string = gb.to_string()
if g_string == win_string:
winner = True
break
possibilities = gb.legal_moves(visited) # returns a list of possible moves to take
if len(possibilities) > 0:
moves.append(copy.deepcopy(gb))
gb.perform(possibilities[0]) # this modifies gb, according to the gameplay move.
# snipped, for brevity.
如果在100次迭代后,我打印moves
,我会得到100个相同的对象。如果我在每次附加对象之前打印它,它们在追加时肯定是不同的。
为了澄清,我想要这些对象的副本(用于图形之类的东西,以执行DFS和BFS)
以下是我的GameBoard课程
class GameBoard:
number_of_rows = 3
rows = []
global random_puzzle
def __init__(self, setup):
#some code. fills in the rows. adds some things to that list. etcetc..
# more code
答案 0 :(得分:0)
您的代码对于简单的字典对象有效:
seq = 1
a_dict = {}
moves = []
while seq < 4:
a_dict['key' + str(seq)] = 'value' + str(seq)
moves.append(copy.deepcopy(a_dict))
seq = seq + 1
print moves
对于您的对象,deepcopy无法访问游戏板的内容。
你的游戏板数据是否以某种方式存储在对象之外,在这种情况下只复制指向它的指针?董事会的哪个州保存,第一个还是最后一个?你能发布关于对象结构的更多细节吗?
编辑:Try adding your own getstate/setstate methods以告诉deepcopy需要在实例之间复制哪些数据。例如,如果您的rows
数组包含游戏板:
def __getstate__(self):
return self.rows
def __setstate__(self, rows):
self.rows = rows