Сохранение глубокой копии объекта, затем изменение его и сохранение другой копии? - PullRequest
0 голосов
/ 08 октября 2010

У меня есть класс 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 голосов
/ 08 октября 2010

Ваш код действителен для простого словарного объекта:

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 не достигает содержимого вашей игровой доски.

Хранятся ли данные вашей игровой доски вне объекта, и в этом случае копируется только указатель на него? Какое состояние платы сохраняется: первое или последнее? Можете ли вы опубликовать более подробную информацию о структуре вашего объекта?


РЕДАКТИРОВАТЬ: Попробуйте добавить свои собственные методы getstate / setstate , чтобы сообщить Deepcopy, какие данные необходимо копировать между экземплярами. Например, если ваш массив rows содержит игровую доску:

def __getstate__(self): 
    return self.rows

def __setstate__(self, rows): 
    self.rows = rows 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...