保存对象的深层副本,然后修改它并保存另一个副本?

时间:2010-10-08 14:55:59

标签: python copy

我有一个'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

1 个答案:

答案 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