2012-02-03 2 views
0

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

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

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

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

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

B = A 

А затем в BI сделать необходимые изменения

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

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

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

Однако это также изменило мой оригинальный словарь A, который я хотел бы сделать резервным.

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

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

+0

Почему вы думаете, что 'B = A' делает копию словаря? – kindall

+0

На самом деле, как видим, B = A делает копию A и назначает ее B, но A является ссылкой на словарь (а его содержание состоит из ссылок на списки). Надеюсь, я был полезен ... – jimifiki

ответ

2

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

import copy 
B = copy.deepcopy(A) 

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

+0

Это сработало красиво, спасибо! – ricoamor

0

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

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

+0

Попробуйте следующее, чтобы получить разницу между копированием ссылки на dict и копированием словаря: A = {0: 3,1: 4,2: 3}; B = A; C = A.copy(); B [2] = 4; напечатайте A [2], B [2], C [2]. – jimifiki

Смежные вопросы