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

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

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

  • Различные способы копирования словарей в Python

  • В чем разница между ссылками, поверхностными и глубокими копиями

  • Когда вы можете использовать каждый из различных методов для копирования словарей Python

Оглавление

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

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

МетодПримечания

= Оператор

Создает указатель на исходный словарь

.copy() Метод

Создает поверхностную копию словаря

deepcopy() Функция

Создает глубокую копию словаря

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

Перед тем как углубиться в то, как копировать словари в Python, давайте быстро рассмотрим, что такое словари в Python. Словари в Python - это упорядоченный тип данных, где данные хранятся в виде пар key:value

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • При поверхностном копировании дублируется как можно меньше данных.

  • Это означает, что элементы создаются как ссылки на оригинальные элементы.

  • Когда изменяются примитивные типы данных (например, целые числа и строки), связь с исходным словарём разрывается.

  • При изменении не примитивных типов данных значения изменяются в обоих местах.

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

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

print(copied)

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

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

# Изменение элементов в поверхностно скопированном словаре
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 и выше.

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

# Изменение непримитивного типа данных в скопированном словаре
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
from copy import deepcopy

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

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

# Изменение непримитивного типа данных в глубокой копии
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(). Вы узнали, как поверхностные копии создают ленивые копии. Тем временем, глубокие копии дублируют все в словаре и разрывают все ассоциативные связи со словарем.

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

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

Last updated