Как скопировать словарь и редактировать только копию

Пакет - это механизм Java для организации классов в пространства имен. Яркой является Java ARchive, файл, который объединяет несколько классов Java в один.

678
задан Amir 17 November 2018 в 05:34
поделиться

6 ответов

следующий код, который находится на dicts, который следует за json синтаксисом больше чем в 3 раза быстрее, чем deepcopy

def CopyDict(dSrc):
    try:
        return json.loads(json.dumps(dSrc))
    except Exception as e:
        Logger.warning("Can't copy dict the preferred way:"+str(dSrc))
        return deepcopy(dSrc)
0
ответ дан 22 November 2019 в 21:30
поделиться

Python never неявно копирует объекты. Когда вы устанавливаете dict2 = dict1, вы заставляете их ссылаться на один и тот же точный объект dict, поэтому, когда вы мутируете его, все ссылки на него продолжают ссылаться на объект в его текущем состоянии.

Если вы хотите скопировать дикт (что бывает редко), вы должны сделать это явно с

dict2 = dict(dict1)

или

dict2 = dict1.copy()
778
ответ дан 22 November 2019 в 21:30
поделиться

Когда вы назначаете dict2 = dict1 , вы не делаете копию dict1 , это приводит к dict2 - это просто еще одно имя для dict1 .

Чтобы скопировать изменяемые типы, такие как словари, используйте copy / deepcopy модуля copy .

import copy

dict2 = copy.deepcopy(dict1)
555
ответ дан 22 November 2019 в 21:30
поделиться

dict2 = dict1 не копирует словарь. Это просто дает вам программисту второй способ (dict2) ссылаться на тот же словарь.

5
ответ дан 22 November 2019 в 21:30
поделиться

Каждая переменная в Python (например, dict1 или str или __ builtins __ является указатель на некий скрытый платонический «объект» внутри машины.

Если вы установите dict1 = dict2 , вы просто укажете dict1 на тот же объект (или ячейку памяти, или любую другую аналогию), что и dict2 . Теперь объект, на который ссылается dict1 , является тем же объектом, на который ссылается dict2 .

Вы можете проверить: dict1 is dict2 должно быть True . Кроме того, id (dict1) должен быть таким же, как id (dict2) .

Вы хотите dict1 = copy (dict2) или dict1 = deepcopy (dict2) .

В чем разница между копией и глубокой копией ? deepcopy гарантирует, что элементы dict2 (вы указали его на список?) Также являются копиями.

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

7
ответ дан 22 November 2019 в 21:30
поделиться

Поначалу это меня тоже смутило, потому что я исходил из фона C.

В C переменная - это место в памяти определенного типа. Присвоение переменной копирует данные в ячейку памяти переменной.

Но в Python переменные действуют больше как указатели на объекты. Таким образом, присвоение одной переменной другой не создает копию, это просто указывает на то, что имя переменной указывает на один и тот же объект.

9
ответ дан 22 November 2019 в 21:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: