Пакет - это механизм Java для организации классов в пространства имен. Яркой является Java ARchive, файл, который объединяет несколько классов Java в один.
следующий код, который находится на 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)
Python never неявно копирует объекты. Когда вы устанавливаете dict2 = dict1
, вы заставляете их ссылаться на один и тот же точный объект dict, поэтому, когда вы мутируете его, все ссылки на него продолжают ссылаться на объект в его текущем состоянии.
Если вы хотите скопировать дикт (что бывает редко), вы должны сделать это явно с
dict2 = dict(dict1)
или
dict2 = dict1.copy()
Когда вы назначаете dict2 = dict1
, вы не делаете копию dict1
, это приводит к dict2
- это просто еще одно имя для dict1
.
Чтобы скопировать изменяемые типы, такие как словари, используйте copy
/ deepcopy
модуля copy
.
import copy
dict2 = copy.deepcopy(dict1)
dict2 = dict1
не копирует словарь. Это просто дает вам программисту второй способ (dict2
) ссылаться на тот же словарь.
Каждая переменная в 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
- обычно писать код, который в этом нуждается (на мой взгляд), - плохая практика.
Поначалу это меня тоже смутило, потому что я исходил из фона C.
В C переменная - это место в памяти определенного типа. Присвоение переменной копирует данные в ячейку памяти переменной.
Но в Python переменные действуют больше как указатели на объекты. Таким образом, присвоение одной переменной другой не создает копию, это просто указывает на то, что имя переменной указывает на один и тот же объект.