Обновление словаря Python в алгоритме Монте-Карло - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь написать код Монте-Карло, где я оптимизирую элементы в словаре.Например, я определяю свой исходный словарь как

A = {}
A[1] = ['a','b','c']
A[2] = ['d','e','f']

Это приводит к

>>> A
{1: ['a', 'b', 'c'], 2: ['d', 'e', 'f']}

Теперь скажем, что пробный ход в моем Монте-Карло состоит в том, чтобы взять случайный элемент 'a'A [1] и положить его в A [2].Тем не менее, я хочу сохранить свой оригинальный словарь.Поэтому я сначала создаю новый словарь:

B = A

А затем в BI вносим нужные изменения

B[1].remove('a')
B[2].append('a')

В результате получается модифицированный словарь, который я хотел получить:

>>> B
{1: ['b', 'c'], 2: ['d', 'e', 'f', 'a']}

Однако это также изменило мой первоначальный словарь А., который я действительно хотел сделать резервную копию.

>>> A
{1: ['b', 'c'], 2: ['d', 'e', 'f', 'a']}

Есть ли способ, которым я могу это сделать?Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Вам необходимо сделать глубокую копию словаря:

import copy
B = copy.deepcopy(A)

Если вы этого не сделаете, ссылки на массивы распределяются между словарями.

0 голосов
/ 04 февраля 2012

Есть способ сделать поверхностную копию словарей:

A = {}
A[3] = 2
C = A.copy()
C[3] = 3
print C[3],A[3]

выход: 3,2

но это не сработает в вашем конкретном случае, поскольку ваши ключи действительно являются ссылками на изменяемые объекты, в вашем случае вы либо знаете, как работают объекты, и реализуете свою копию:

B = {}
for i in A.keys():
    B[i] = []
    B[i].extend(A[i])
B[1].remove('a')
B[2].append('a')

или вы делаете глубокую копию (). Последнее решение мне не очень нравится, так как я не могу контролировать, как на самом деле работает глубокая копия. http://docs.python.org/library/copy.html

...