Python dict copy deepcopy

Copy the Dictionary and edit it in Python

How to deep copy the dictionary and edit it in Python without modifying the original dict? Python does not implicitly copy objects, and if you are not careful, you may end up modifying the original dictionary. In this article, we will learn how to copy a dictionary in Python, and how to edit the copy without affecting the original.

When you set dict2 = dict1 , you are making them refer to the same exact dict object, so when you mutate it, all references to it keep referring to the object in its current state. This is why you need a deep copy of the original dictionary.

See this example, when we edit the first dict , the other dict also changes.

 # The Problem with Editing a Dict my_dict = # Assign the orignal dict to new dict new_dict = my_dict # Edit the new Dict new_dict['a']=4 # The other dict will also be edited print('Original :', my_dict) print('Copied :', new_dict) # Output: # Original dictionary: # Copied dictionary:

In this article, we will solve this problem using the shallow copy and deep copy methods. So let’s get started:

Читайте также:  quotes

1. Quick Examples to Copy Dictionary and Edit it

These are just quick examples of how to copy the dictionary and edit it in Python. We will discuss each of these methods in much detail later on.

 # Quick Examples to Copy Dictionary and Edit it # Original Dictionary original_dict = # Method 1 : Copy Dictionary using dict() function new_dict = dict(original_dict) new_dict['a'] = 3 # Method 2 : Copy Dictionary using dict.copy() method mutated_dict = original_dict.copy() mutated_dict['a'] = 4 # Method 3 : Deep copy Dictionary using deepcopy() function import copy deep_copied_dict = copy.deepcopy(original_dict) deep_copied_dict['a'] = 5 # Method 4 : Copy Dictionary using ** unpackaging unpacked_dict = <**original_dict>unpacked_dict['a'] = 6 

2. dict() – Copy the Dictionary and Edit it

To avoid spreading the change to other dictionary references, we need to create a new dictionary from the original dictionary. We can use the dict() function to create a new dictionary that is a copy of an existing dictionary, by passing the existing dictionary as an argument to the dict() constructor.

The dict() constructor in Python can be used to create a new dictionary from an iterable of key-value pairs, or from a sequence of key-value tuples. When you pass a dictionary to the dict() constructor, a new dictionary object is created with the same key-value pairs as the original.

 # Copy Dict using the dict() function my_dict_1 = # Copy my_dict_1 to my_dict_2 my_dict_2 = dict(my_dict_1) # Edit any of the dict my_dict_2['a']=4 # Print the original and copied dictionaries print('Original :', my_dict_1) print('Copied :', my_dict_2) 

This example yields the below output.

In the above example, you see that the dict() function created another instance of the dictionary. Now if we edit any of the dictionaries, the other one will not be affected.

3. dict.copy() – Copy Original Dictionary and Mutate it

The copy() method of dictionaries in Python creates a shallow copy of the original dictionary. This means that a new dictionary object is created with the same key-value pairs as the original dictionary.

 # Create a dictionary with keys 'a' and 'b' and values 1 and 2 original_dict = # Copy the original dictionary copied_dict = original_dict.copy() # Modify the copied dictionary by changing the value of key 'a' copied_dict['a'] = 3 # Print both dictionaries to see the differences print('Original dictionary:', original_dict) print('Copied dictionary:', copied_dict) 

This example yields the below output.

 # Output: Original dictionary: Copied dictionary:

A shallow copy is a type of copy where a new object is created and the original object’s values are copied into the new object. However, it does not duplicate individual elements. Instead, the new object contains references to the original object’s elements.

See this example to clear your doubt between the normal copy and the shallow copy using the dict.copy() function.

 # Create the original dictionary original_dict = # Create a shallow copy of the dictionary copied_dict = original_dict.copy() # Modify the list inside the copied dictionary copied_dict['b'].append(5) # Print both dictionaries and their IDs print("Original:", original_dict) print("Copied:", copied_dict) print("Original ID:", id(original_dict)) print("Copied ID:", id(copied_dict)) print("Original 'b' ID:", id(original_dict['b'])) print("Copied 'b' ID:", id(copied_dict['b'])) 
 # Output: Original: Copied: Original ID: 1326843015936 Copied ID: 1326841630400 Original 'b' ID: 1326843246592 Copied 'b' ID: 1326843246592 

4. deepcopy() – Deep Copy the Dictionary and Edit it

In Python, deepcopy() is a method from the copy module that creates a new object that is a deep copy of the original object. A deep copy means that all nested objects, such as lists and dictionaries, are also copied and new objects are created for them. This ensures that any changes made to the copied object do not affect the original object.

 # Import copy module import copy # create the original dictionary original_dict = > # create a deep copy of the dictionary copied_dict = copy.deepcopy(original_dict) # modify the value of 'c' inside the copied dictionary copied_dict['b']['c'] = 3 # print both dictionaries and their IDs print("Original :", original_dict) print("Copied :", copied_dict) print("Original ID:", id(original_dict)) print("Copied ID:", id(copied_dict)) print("Original 'b' ID:", id(original_dict['b'])) print("Copied 'b' ID:", id(copied_dict['b'])) 
 # Output: Original : > Copied : > Original ID: 2175881612992 Copied ID: 2175883228672 Original 'b' ID: 2175882998528 Copied 'b' ID: 2175883228608 

See the difference between the shallow copy and deep copy in Python.

Источник

Использование функций copy и deepcopy в Python

Использование функций copy и deepcopy в Python

В этой статье я расскажу, как скопировать объект с помощью мелкой копии и глубокой копии в Python.

Введение

При программировании нам нужно скопировать существующие данные. Когда мы присваиваем переменную другому оператору, то оператор присваивания не копирует объект, а просто создает новую ссылку на тот же объект.

Давайте приступим к рассмотрению конкретных примеров.

Как использовать функцию copy в Python?

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

Мы можем использовать неглубокое копирование в Python с помощью модуля копирования. Для выполнения операции неглубокого копирования мы используем метод copy модуля copy.

Метод copy принимает исходный объект коллекции в качестве входных данных и создает новый объект коллекции со ссылкой на элементы исходного объекта коллекции. Затем он возвращает ссылку на новый объект коллекции.

В следующем примере я создам копию данного словаря Python с помощью метода copy:

import copy data = print("Оригинальный словарь:") print(data) new_data = copy.copy(data) print("Новый словарь:") print(new_data)

Оригинальный словарь: Новый словарь:

В выходных данных мы видим, что мы создали такой же словарь, как и исходный словарь, приведенный выше.

Как работает неглубокое копирование?

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

import copy data = print("Оригинальный словарь:") print(data) new_data = copy.copy(data) print("Новый словарь:") print(new_data) new_data[1] = 99 print("Оригинальный словарь после изменения:") print(data) print("Новый словарь после изменения:") print(new_data)

Оригинальный словарь: Новый словарь: Оригинальный словарь после изменения: Новый словарь после изменения:

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

import copy data = print("Оригинальный словарь:") print(data) new_data = copy.copy(data) print("Новый словарь:") print(new_data) data[1] = 99 print("Оригинальный словарь после изменения:") print(data) print("Новый словарь после изменения:") print(new_data)

Оригинальный словарь: Новый словарь: Оригинальный словарь после изменения: Новый словарь после изменения:

Точно так же, когда мы добавляем какой-либо элемент к исходному объекту, он не будет иметь никакого влияния на новый объект.

import copy data = print("Оригинальный словарь:") print(data) new_data = copy.copy(data) print("Новый словарь:") print(new_data) data[7] = 99 print("Оригинальный словарь после изменения:") print(data) print("Новый словарь после изменения:") print(new_data)

Оригинальный словарь: Новый словарь: Оригинальный словарь после изменения: Новый словарь после изменения:

Сценарии, рассмотренные выше, изменяются, когда в объектах присутствует вложенность, то есть когда копируемые объекты содержат другие объекты, изменения, происходящие во вложенных объектах, видны как в исходном, так и в копируемом объекте.

Это можно увидеть в следующем примере:

import copy data = > print("Оригинальный словарь:") print(data) new_data = copy.copy(data) print("Новый словарь:") print(new_data) data[5][10] = 99 print("Оригинальный словарь после изменения:") print(data) print("Новый словарь после изменения:") print(new_data)
Оригинальный словарь: > Новый словарь: > Оригинальный словарь после изменения: > Новый словарь после изменения: >

При копировании объекта с помощью метода copy.copy создается только копия объекта, передаваемая в качестве параметра методу copy. Элементы внутри объекта не копируются, копируются только ссылки на элементы.

Таким образом, когда в исходном объекте в качестве элементов присутствуют только примитивные типы данных, такие как int, double, string. Изменения не видны новому объекту при выполнении в исходном объекте, поскольку эти типы данных неизменяемы и для каждого изменения создается новый объект.

Но в случае вложенных объектов ссылки не изменяются, и когда мы вносим какие-либо изменения в один из объектов, они видны в другом объекте.

Как использовать deepcopy в Python?

Чтобы избежать проблемы, обсуждаемой при выполнении неглубокого копирования, мы будем использовать метод deepcopy. Метод deepcopy рекурсивно создает копию каждого элемента объекта и не копирует ссылки.

Это можно сделать следующим образом:

import copy data = > print("Оригинальный словарь:") print(data) new_data = copy.deepcopy(data) print("Копия словаря:") print(new_data)
Оригинальный словарь: > Копия словаря: >

После использования функции deepcopy изменения, внесенные в исходный объект, не будут отображаться в скопированном объекте, даже если присутствует вложенность.

import copy data = > print("Оригинальный словарь:") print(data) new_data = copy.deepcopy(data) print("Копия словаря:") print(new_data) data[4][8] = 99 print("Оригинал после изменения:") print(data) print("Копия после изменения:") print(new_data)
Оригинальный словарь: > Копия словаря: > Оригинал после изменения: > Копия после изменения: >

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

Заключение

В этой статье вы узнали о неглубоком копировании и глубоком копировании в Python.

Вы видели, что при наличии вложенных объектов для создания копии объектов следует использовать функцию deepcopy. Мы также можем написать программы, используемые в этой статье, с обработкой исключений с помощью python try, чтобы сделать программы более надежными или чтобы систематически обрабатывать ошибки.

Программирую на Python с 2017 года. Люблю создавать контент, который помогает людям понять сложные вещи. Не представляю жизнь без непрерывного цикла обучения, спорта и чувства юмора.

Ссылка на мой github есть в шапке. Залетай.

Источник

Оцените статью