2016-01-19 2 views
1

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

У меня есть простой словарь a, который содержит один ключ и список. Я хотел скопировать этот словарь для дальнейшего использования, но любые изменения, которые я сделать, чтобы a эффект моя копия, b:.

>>> a 
{'kn': [8, 9, 10, 11, 12]} 
>>> b = a.copy() 
>>> b 
{'kn': [8, 9, 10, 11, 12]} 

>>> for l in range(len(a['kn'])): 
...  a['kn'][l] = a['kn'][l] + 10 

>>> a 
{'kn': [18, 19, 20, 21, 22]} 
>>> b 
{'kn': [18, 19, 20, 21, 22]} 

ответ

3

ЮП, dict.copy возвращает неполную копию словаря:

a.copy?? 
Docstring: D.copy() -> a shallow copy of D 
Type:  builtin_function_or_method 

Мелкая копия создает новый составной объект, а затем (по возможности) вставляет ссылки в i t к объектам, найденным в оригинале.

Вместо этого следует использовать copy.deepcopy который выполняет глубокую копию:

Глубокое копирование создает новый объект соединения, а затем, рекурсивно, вставки копии в него предметов, найденных в оригинал.

>>> import copy 
>>> b = copy.deepcopy(a) 
>>> for l in range(len(a['kn'])): 
...  a['kn'][l] = a['kn'][l] + 10 
>>> a 
{'kn': [18, 19, 20, 21, 22]} 
>>> b 
{'kn': [8, 9, 10, 11, 12]} 
4

Это потому, что вы не делаете глубокую копию словаря.

Это должно направить вас в правильном направлении: https://docs.python.org/2/library/copy.html

Короче говоря, когда вы copy() словаря, вы только копирование указателей к элементам в словаре. Таким образом, когда вы меняете значения в одном словаре, так как указатели одинаковы в обоих, это изменение немедленно появляется в другом.

Выполняя deepcopy(), вы копируете значения из одного словаря в другой. Теперь у вас есть две отдельные копии.

1

Если я правильно понимаю, .copy() делает мелкую копию, поэтому список внутри вашего словаря по-прежнему передается как ссылка. Вам нужно использовать глубокую копию.

 
import copy 
a = {'kn': [8, 9, 10, 11, 12]} 
b = copy.deepcopy(a) 
0

Вы использовали неглубокую версию .copy(), то есть вы создали две копии словаря, но оба они по-прежнему содержат ту же ссылку списка. Вы должны использовать copy.deepcopy(), как описано here, разница:

Мелкая копия создает новый объект соединения, а затем (по мере возможности) вставляет ссылки в нее к объектам, найденным в оригинале ,

Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.

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