Python, создание новой переменной из словаря? не так просто, как кажется? - PullRequest
3 голосов
/ 19 августа 2010

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

newdictionary = olddictionary

Ответы [ 6 ]

7 голосов
/ 19 августа 2010

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

from copy import deepcopy
dictionary_new = deepcopy(dictionary_old)

Простое использование a = dict(b) или a = b.copy() сделает поверхностную копию и оставит любые списки в вашем словаре как ссылки друг на друга (так что, хотя редактирование других элементов не вызовет проблем, редактирование списка в одном словаре вызовет изменения в другом словаре тоже).

6 голосов
/ 19 августа 2010

Вы просто даете newdictionary указание на ту же ссылку, olddictionary указывает. См. эту страницу (речь идет о списках, но также применима и к диктовкам).

alt text


Вместо этого используйте .copy() (примечание: это создает поверхностную копию):

newdictionary = olddictionary.copy()

Для создания глубокой копии вы можете использовать .deepcopy() из модуля копирования

newdictionary = copy.deepcopy(olddictionary)

Wikepedia:

Мелкое и глубокое копирование

3 голосов
/ 19 августа 2010

Такое назначение в Python просто заставляет имя newdictionary ссылаться на то же, что и olddictionary, как вы заметили Вы можете создать новый словарь с помощью конструктора dict():

newdictionary = dict(olddictionary)

Обратите внимание, что это делает мелкую копию. Глубокие копии см. В стандартном библиотечном модуле copy.

1 голос
/ 19 августа 2010
newdictionary = dict(olddictionary.items())

Это создает новую копию (точнее, она передает содержимое olddict в виде пар (ключ, значение) в dict, что создает новый словарь из пар (ключ, значение)).

Редактировать: О да, скопировать - полностью забыл это, это правильный способ сделать это.

a = b

просто копирует ссылку, но не объект.

0 голосов
/ 19 августа 2010

Я думаю, вам нужна глубокая копия того, что вы просите. Смотрите здесь .

Это выглядит как dict.copy () делает мелкую копию, что и делает Рик не хочет.

from copy import deepcopy
d = {}
d['names'] = ['Alfred', 'Bertrand']
c = d.copy()
dc = deepcopy(d)
0 голосов
/ 19 августа 2010

Вы просто создаете другую ссылку на тот же словарь.

Вам необходимо сделать копию: используйте одно из следующего (после проверки в документации, что делает каждый):

new = dict(old)

new = old.copy()

import copy
new = copy.copy(old)

import copy
new = copy.deepcopy(old)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...