> For the complete documentation index, see [llms.txt](https://bemind.gitbook.io/neural/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bemind.gitbook.io/neural/python/python-dictionaries/kopirovanie-slovarya-v-python-polnoe-rukovodstvo.md).

# Копирование словаря в Python: Полное руководство

В этом руководстве **вы узнаете все различные способы копирования словаря Python**. Хотя это может показаться очень элементарной задачей, в этом есть ряд сложностей. В этом руководстве вы узнаете, как копировать словарь по ссылке, создавать поверхностные копии и глубокие копии.

К концу этого учебного пособия, вы будете хорошо понимать:

* Различные способы копирования словарей в Python
* В чем разница между ссылками, поверхностными и глубокими копиями
* Когда вы можете использовать каждый из различных методов для копирования словарей Python

Оглавление

* [Быстрый ответ: скопируйте словарь Python](#bystryi-otvet-skopiruite-slovar-python)
* [Краткий обзор словарей Python](#kratkii-obzor-slovarei-python)
* [Как скопировать словарь Python с помощью оператора `=`](#kak-skopirovat-slovar-python-s-pomoshyu-kopirovaniya)
* [Как скопировать словарь Python с помощью копирования](#kak-skopirovat-slovar-python-s-pomoshyu-kopirovaniya)
* [Как глубоко скопировать словарь Python](#kak-gluboko-skopirovat-slovar-python)
* [Заключение](#zaklyuchenie)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

### Быстрый ответ: скопируйте словарь Python

Если у вас мало времени, вот краткий ответ на то, как копировать словарь в Python. Эти пункты подробно рассмотрены в разделах ниже:

| Метод                | Примечания                            |
| -------------------- | ------------------------------------- |
| `=` Оператор         | Создает указатель на исходный словарь |
| `.copy()` Метод      | Создает *поверхностную* копию словаря |
| `deepcopy()` Функция | Создает *глубокую* копию словаря      |

### Краткий обзор словарей Python

Перед тем как углубиться в то, как копировать словари в Python, давайте быстро рассмотрим, что такое словари в Python. [Словари в Python](https://datagy.io/python-dictionary/) - это упорядоченный тип данных, где данные хранятся в виде пар `key:value`

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

Давайте посмотрим, как мы можем создать словарь в Python:

```python
# Создание словаря Python
original = {
    'a': 1,         # Ключ 'a' со значением 1
    'b': 2,         # Ключ 'b' со значением 2
    'c': [1,2,3]    # Ключ 'c' с массивом значений [1, 2, 3]
}
```

Как скопировать словарь Python с помощью оператора `=`

Когда мы пытаемся скопировать словарь с помощью оператора `=`, может показаться, что мы создаем копию словаря. Однако, на самом деле, мы лишь создаем ссылку на оригинальный словарь. Фактически, мы только присваиваем *тот же самый* словарь второй переменной.

Посмотрим, как это выглядит:

```python
# Присвоение словаря с использованием оператора =
original = {'a': 1, 'b': 2, 'c': [1,2,3]}
copied = original
```

Мы можем подтвердить, что это на самом деле не копирует словарь, используя функцию `id()`. Она покажет нам, где в памяти хранятся данные:

```python
# Проверка идентификаторов наших словарей
original = {'a': 1, 'b': 2, 'c': [1,2,3]}
copied = original

print(id(original))  # Выводим идентификатор оригинального словаря
print(id(copied))    # Выводим идентификатор копированного словаря

# Возвращает:
# 140195249225088
# 140195249225088
```

В следующем разделе вы узнаете, как создать копию словаря с помощью метода `.copy()`

### Как скопировать словарь Python с помощью копирования

Самый простой способ создать копию словаря в Python — использовать метод `.copy()`. Этот метод возвращает **поверхностную копию** словаря. Давайте разберем, что означает поверхностная копия:

* При поверхностном копировании дублируется как можно меньше данных.
* Это означает, что элементы создаются как *ссылки* на оригинальные элементы.
* Когда изменяются примитивные типы данных (например, целые числа и строки), связь с исходным словарём разрывается.
* При изменении не примитивных типов данных значения изменяются в обоих местах.

Посмотрим, как это выглядит на практике, используя наш приведённый выше словарь:

```python
# Копирование словаря с помощью .copy()
original = {'a': 1, 'b': 2, 'c': [1, 2, 3]}
copied = original.copy()

print(copied)

# Возвращает: {'a': 1, 'b': 2, 'c': [1, 2, 3]}
```

Мы видим, что словарь был успешно скопирован. Давайте посмотрим, что произойдет, если мы изменим элемент в скопированном словаре. Изменим значение ключа `b` в нашем скопированном словаре:

```python
# Изменение элементов в поверхностно скопированном словаре
original = {'a': 1, 'b': 2, 'c': [1,2,3]}
copied = original.copy()
copied['b'] = 99

print(f'{original=}')  # Выводим оригинальный словарь
print(f'{copied=}')    # Выводим скопированный словарь

# Возвращает: 
# original={'a': 1, 'b': 2, 'c': [1, 2, 3]}
# copied={'a': 1, 'b': 99, 'c': [1, 2, 3]}
```

Мы видим, что используя метод `.copy()`, мы смогли изменить значение в новом словаре, сохраняя старое значение неизменным. В приведенном выше примере мы использовали f-строки для вывода наших словарей. Эта функция доступна в Python 3.8 и выше.

Давайте посмотрим, что произойдет, когда мы изменим значение списка в нашей скопированной словаре:

```python
# Изменение непримитивного типа данных в скопированном словаре
original = {'a': 1, 'b': 2, 'c': [1,2,3]}
copied = original.copy()
copied['c'].append(99)

print(f'{original=}')  # Выводим оригинальный словарь
print(f'{copied=}')    # Выводим скопированный словарь

# Возвращает: 
# original={'a': 1, 'b': 2, 'c': [1, 2, 3, 99]}
# copied={'a': 1, 'b': 2, 'c': [1, 2, 3, 99]}
```

Мы видим, что при изменении значения непримитивного типа данных (например, списка), значение в оригинальном словаре также изменилось.

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

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

### Как глубоко скопировать словарь Python

Если мы хотим создать дубликат словаря, который разрывает все связи с оригиналом, мы можем создать **глубокую копию** словаря. Для этого сначала нужно импортировать модуль `copy`, который содержит функцию `deepcopy()`.

Давайте посмотрим, как мы можем использовать эту функцию для создания глубокой копии словаря:

```python
# Создание глубокой копии словаря в Python
from copy import deepcopy

original = {'a': [1,2,3], 'b': 2, 'c': [1, 2, 3]}
copied = deepcopy(original)
```

Теперь давайте посмотрим, что происходит, когда мы изменяем сложный тип данных в нашем словаре:

```python
# Изменение непримитивного типа данных в глубокой копии
copied['c'].append(99)

print(f'{original=}')  # Выводим оригинальный словарь
print(f'{copied=}')    # Выводим глубоко скопированный словарь

# Возвращает:
# original={'a': [1, 2, 3], 'b': 2, 'c': [1, 2, 3]}
# copied={'a': [1, 2, 3], 'b': 2, 'c': [1, 2, 3, 99]}
```

Когда мы создаем глубокую копию, мы создаем совершенно новый объект, который копирует этот словарь в этот момент времени.

### Заключение

В этом руководстве вы научились копировать словарь Python. Вы узнали о различиях между созданием копии с помощью оператора `=`, метода `.copy()` и функции `deepcopy()`. Вы узнали, как поверхностные копии создают ленивые копии. Тем временем, глубокие копии дублируют все в словаре и разрывают все ассоциативные связи со словарем.

### Дополнительные ресурсы

Чтобы узнать больше о связанных темах, ознакомьтесь с учебными материалами ниже:

* Словари Python: полный обзор
* Python: добавить пару «ключ: значение» в словарь
* Слияние словарей Python – объединение словарей (7 способов)
* Python Defaultdict: обзор и примеры
* [Понимание методов мелкого и глубокого копирования](https://docs.python.org/3/library/copy.html)
