- copy — Shallow and deep copy operations¶
- Метод dict.copy() в Python
- Возвращаемое значение
- Пример 1: Как работает копирование для словарей?
- Разница в использовании метода copy() и оператора = для копирования словарей
- Пример 2: Использование оператора =
- Пример 3: использование copy()
- 4 простые способы скопировать словарь в Python
- 4 простые способы скопировать словарь в Python
- Введение
- Методы для копирования словаря в Python
- 1. Копирование словаря элемента по элементу
- 2. Скопировать словарь в Python
- 3. Использование метода Copy ()
- 4. Использование COPY.DEEPCOPY () Метод для копирования словаря в Python
- Заключение
- использованная литература
- Читайте ещё по теме:
copy — Shallow and deep copy operations¶
Assignment statements in Python do not copy objects, they create bindings between a target and an object. For collections that are mutable or contain mutable items, a copy is sometimes needed so one can change one copy without changing the other. This module provides generic shallow and deep copy operations (explained below).
Return a shallow copy of x.
Raised for module specific errors.
The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances):
- A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
- A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.
Two problems often exist with deep copy operations that don’t exist with shallow copy operations:
- Recursive objects (compound objects that, directly or indirectly, contain a reference to themselves) may cause a recursive loop.
- Because deep copy copies everything it may copy too much, such as data which is intended to be shared between copies.
The deepcopy() function avoids these problems by:
- keeping a memo dictionary of objects already copied during the current copying pass; and
- letting user-defined classes override the copying operation or the set of components copied.
This module does not copy types like module, method, stack trace, stack frame, file, socket, window, or any similar types. It does “copy” functions and classes (shallow and deeply), by returning the original object unchanged; this is compatible with the way these are treated by the pickle module.
Shallow copies of dictionaries can be made using dict.copy() , and of lists by assigning a slice of the entire list, for example, copied_list = original_list[:] .
Classes can use the same interfaces to control copying that they use to control pickling. See the description of module pickle for information on these methods. In fact, the copy module uses the registered pickle functions from the copyreg module.
In order for a class to define its own copy implementation, it can define special methods __copy__() and __deepcopy__() . The former is called to implement the shallow copy operation; no additional arguments are passed. The latter is called to implement the deep copy operation; it is passed one argument, the memo dictionary. If the __deepcopy__() implementation needs to make a deep copy of a component, it should call the deepcopy() function with the component as first argument and the memo dictionary as second argument. The memo dictionary should be treated as an opaque object.
Discussion of the special methods used to support object state retrieval and restoration.
Метод dict.copy() в Python
Метод dict.copy() в Python возвращает неглубокую копию словаря.
Метод copy() не принимает никаких параметров.
Возвращаемое значение
Этот метод возвращает мелкую копию словаря. Он не изменяет исходный словарь.
Пример 1: Как работает копирование для словарей?
original = new = original.copy() print('Orignal: ', original) print('New: ', new)
Разница в использовании метода copy() и оператора = для копирования словарей
Когда используется метод copy(), создается новый словарь, который заполняется копией ссылок из исходного словаря.
Когда используется оператор =, создается новая ссылка на исходный словарь.
Пример 2: Использование оператора =
original = new = original # removing all elements from the list new.clear() print('new: ', new) print('original: ', original)
Здесь, когда очищается новый словарь, очищается и исходный словарь.
Пример 3: использование copy()
original = new = original.copy() # removing all elements from the list new.clear() print('new: ', new) print('original: ', original)
Здесь, когда новый словарь очищается, исходный словарь остается без изменений.
Python никогда не копирует объекты неявно. Когда вы устанавливаете dict2 = dict1, вы заставляете их ссылаться на один и тот же точный объект dict, поэтому, когда вы изменяете его, все ссылки на него продолжают ссылаться на объект в его текущем состоянии. Если вы хотите скопировать dict (что бывает редко), вы должны сделать это явно с помощью
dict2 = dict(dict1)
или так
dict2 = dict1.copy()
Когда вы назначаете dict2 = dict1, вы не делаете копию dict1, это приводит к тому, что dict2 является просто другим именем для dict1.
Чтобы скопировать изменяемые типы, такие как словари, используйте deepcopy модуля копирования.
import copy
dict2 = copy.deepcopy(dict1)
Подробнее можно прочитать в справке https://docs.python.org/3.6/library/copy.html
В дополнение к другим предоставленным решениям вы можете использовать ** для интеграции словаря в пустой словарь, например,
Теперь у вас будет «неглубокая» или как ее еще называют shallow копия other_dict.
Разница между неглубоким и глубоким копированием актуальна только для составных объектов (объектов, содержащих другие объекты, такие как списки или экземпляры классов):
Неглубокая копия создает новый составной объект, а затем (насколько это возможно) вставляет в него ссылки на объекты, найденные в оригинале.
Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.
>>> import copy
>>> dict1 = >
>>> dict2 = dict1.copy()
>>> dict2
>
>>> dict2[«key2»][«mutable»] = False
>>> dict2
>
>>> dict1
>
>>> id(dict1)
140641197660704
>>> id(dict2)
140641196407832
>>> id(dict1[«key2»])
140641176198960
>>> id(dict2[«key2»])
140641176198960
Даже если мы применили copy для dict1, значение mutable изменяется на false как для dict2, так и для dict1, хотя мы меняем его только на dict2. Это происходит потому, что мы изменили значение изменяемой части dict в dict1. Когда мы применяем копию на dict, она будет делать только неглубокую копию, что означает, что она копирует все неизменяемые значения в новый dict и не копирует изменяемые значения, но будет ссылаться на них.
Конечное решение состоит в том, чтобы сделать глубокую копию dict1, чтобы полностью создать новый dict со всеми скопированными значениями, включая изменяемые значения.
>>>import copy
>>> dict1 = >
>>> dict2 = copy.deepcopy(dict1)
>>> dict2
>
>>> id(dict1)
140641196228824
>>> id(dict2)
140641197662072
>>> id(dict1[«key2»])
140641178056312
>>> id(dict2[«key2»])
140641197662000
>>> dict2[«key2»][«mutable»] = False
>>> dict2
>
>>> dict1
>
Идентификаторы разные, это означает, что dict2 — это совершенно новый dict со всеми значениями в dict1.
Deepcopy необходимо использовать, если вы хотите изменить любое из изменяемых значений, не затрагивая исходный дикт. Если нет, то вы можете использовать неглубокую копию. Deepcopy работает медленно, так как рекурсивно копирует любые вложенные значения в исходном dict, а также занимает дополнительную память.
4 простые способы скопировать словарь в Python
В этом руководстве мы собираемся обсудить различные методы или методы для копирования словаря в Python.
4 простые способы скопировать словарь в Python
Введение
В этом руководстве мы собираемся обсудить различные методы или методы Скопируйте словарь в Python Отказ
Теоретически, Словарь В Python является неупорядоченной коллекцией значений данных, которые хранят соответствующие элементы AS Ключевой элемент пара. Кроме того, каждый элемент может быть доступен пользователем, используя его соответствующие ключ Отказ
Итак, давайте направимся в процедуры копирования.
Методы для копирования словаря в Python
В этом разделе мы собираемся уточнить 4 Разные способы, с которыми можно скопировать словарь в Python. Давайте перейдем на них один за другим.
1. Копирование словаря элемента по элементу
В этой технике мы перемещаемся по всему словарю и копируйте каждый элемент, указанный ключом к новому словарю, который ранее объявил ранее. Посмотрите на код ниже:
#given dictionary dict1= print("Given Dictionary:",dict1) #new dictionary dict2=<> for i in dict1: dict2[i]=dict1[i] #element by elemnet copying print("New copy:",dict2) #Updating dict2 elements and checking the change in dict1 dict2[1]=33 dict2[3][1]='22' #list item updated print("Updated copy:",dict2) print("Given Dictionary:",dict1)
Given Dictionary: New copy: Updated copy: Given Dictionary:
- Мы инициализировали словарь, Dict1.
- После того, как мы распечатаем его, мы объявляем пустой словарь, Dict2 где мы собираемся скопировать Dict1
- Далее мы проходим через Dict1, используя для петли Отказ И используя операцию Dict2 [I] = Dict1 [I] мы копируем каждый элемент из Dict1 к Dict2 Отказ
Теперь, когда наше копирование сделано, помните, что = Оператор создает ссылки на счетные объекты в словаре. Итак, если нетерпимый элемент в Dict2 обновляется, соответствующий элемент в Dict1 сохраняется нетронутыми.
Тогда как, если ИТЕРИТЕЛЬНО Объект, как элемент списка изменен, мы видим изменение Dict1 Список тоже. Вторая часть вышеуказанного описания объясняет это. Попробуйте сравнить и результаты DICT1, так и DICT2 после обновления. Мы видим, что вышеуказанное утверждение верно.
2. Скопировать словарь в Python
Давайте посмотрим, как мы можем напрямую скопировать словарь в Python, используя один ‘=’ оператор.
#given dictionary dict1= print("Given Dictionary:",dict1) #new dictionary dict2=dict1 #copying using = operator print("New copy:",dict2) #Updating dict2 elements and checking the change in dict1 dict2[1]=33 dict2[3][2]='44' #list item updated print("Updated copy:",dict2) print("Given Dictionary:",dict1)
Given Dictionary: New copy: Updated copy: Given Dictionary
- Во-первых, мы инициализируем словарь, Dict1 Отказ И напрямую скопируйте его на новый объект Dict2 по линии кода Dict2 = Dict1.
- Эта операция копирует ссылки каждого объекта, присутствующего в Dict1 в новый словарь, Dict2
- Следовательно, обновление любого элемента DICT2 приведет к изменению DICT1 и наоборот.
- Это ясно из вышеуказанного кода, который, когда мы обновляем любой (нетеабельный или нетеримый) объект в Dict2 мы также видим одинаковое изменение Dict1 Отказ
3. Использование метода Copy ()
Словарь Копировать () Метод в Python возвращает Малая копия данного словаря. Это похоже на то, что мы ранее мы видели в случае копирования элементов, проехав через словарь.
То есть ссылки на элементы словаря вставляются в новый словарь (неглубокая копия). Посмотрите на код ниже:
#given dictionary dict1= < 10:'a', 20:[1,2,3], 30: 'c'>print("Given Dictionary:",dict1) #new dictionary dict2=dict1.copy() #copying using copy() method print("New copy:",dict2) #Updating dict2 elements and checking the change in dict1 dict2[10]=10 dict2[20][2]='45' #list item updated print("Updated copy:",dict2) print("Given Dictionary:",dict1)
Given Dictionary: New copy: Updated copy: Given Dictionary:
- Мы инициализируем словарь Dict1 с некоторыми ценностями. И использовать Копировать () метод на нем создать неглубокую копию
- После того, как копия была сделана, мы обновляем новые элементы и видим соответствующее изменение в исходном словаре.
- Похож на случай элемент по элементу Техника копирования, здесь слишком изменится в нерешимых элементах Dict2 не имеет никакого эффекта на оригинальном словаре
- Принимая во внимание, что для утечников, таких как списки, изменение отражено в данном словаре, Dict1 тоже
4. Использование COPY.DEEPCOPY () Метод для копирования словаря в Python
Deepcopy () Метод в Python является членом Скопировать модуль. Он возвращает новый словарь с копированными элементами пропущенного словаря. Примечание, этот метод копирует все элементы данного словаря в рекурсивный манера. Давайте посмотрим, как можно использовать,
import copy #given dictionary dict1= < 10:'a', 20:[1,2,3], 30: 'c'>print("Given Dictionary:",dict1) #new dictionary dict2=copy.deepcopy(dict1) #copying using deepcopy() method print("New copy:",dict2) #Updating dict2 elements and checking the change in dict1 dict2[10]=10 dict2[20][2]='45' #list item updated print("Updated copy:",dict2) print("Given Dictionary:",dict1)
Given Dictionary: New copy: Updated copy: Given Dictionary:
- В первой строке мы инициализируем оригинальный словарь Dict1 ,
- Мы используем copy.deepcopy () Способ копирования элементов Dict1 в новом словаре Dict2 ,
- После успешного копирования мы обновляем новую копию и видим изменения в оригинальном словаре,
- Как мы можем видеть с вывода, любые изменения в Dict2 это не отражено в Dict1 Отказ Следовательно, этот метод полезен, когда нам нужно изменить новый словарь в нашем коде, сохраняя инфузон оригинала.
Заключение
Итак, в этом руководстве мы узнали о 4 Разные пути к Скопируйте словарь в Python Отказ Для любых вопросов, касающихся темы, не стесняйтесь использовать комментарии ниже.