Автор оригинала: Pankaj Kumar.
Сегодня мы узнаем о классе копирования Python. Мы также узнаем о мелкой копии, глубокой копии и почему нам нужны эти разные операции копирования.
Копирование Python
Библиотека Python предоставляет нам класс копирования с двумя операциями – Копировать (х)
и Deepcopy (x)
– для мелкой копии и глубокой копии соответственно. Но почему мы им нужны? Почему простое назначение одного объекта к другому с использованием оператора равна достаточно хорош?
Причина в том, что, когда мы используем равноправные оператора Python для создания нового объекта, он фактически создает ссылку на тот же объект в памяти. Поскольку оба переменных относятся к тому же объекту, любые изменения в одном тоже будут отражены в другом. В большинстве случаев мы не хотим, поэтому необходимость отдельной операции копирования. Давайте докажем нашу теорию о операторе присваивания через простой пример.
old_list = [1, 2, 3, 4] new_list = old_list new_list.append(5) print("new_list items : ", new_list) print("old_list items : ", old_list)
Выход выше программы Python:
new_list items : [1, 2, 3, 4, 5] old_list items : [1, 2, 3, 4, 5]
Обратите внимание, что мы не изменили Old_List, но поскольку оба списка указывали на тот же объект, любые изменения в одном из них были отражены в другом.
Также, если у нас есть неизменный объект, то оператор назначения достаточно хорош, поскольку значение объекта не изменится.
Неглубокая копия
Когда мы используем функцию Python Moallow Copy Копировать ()
На самом деле он создает новый объект, а затем вставьте ссылки на объекты, найденные в исходном объекте. Так что неглубокая копия достаточно хороша в приведенном выше случае, где у нас есть Список целых чисел, потому что элементы списка неизменяются. Но это недостаточно хорош, когда у нас есть список списка. Позже мы рассмотрим глубокую копию, давайте сначаем посмотрим на пример копирования Python Moallow.
import copy old_list = [1, 2, 3, 4] # python copy - shallow copy new_list = copy.copy(old_list) new_list.append(5) print("new_list items : ", new_list) print("old_list items : ", old_list)
Как вы можете видеть в вышеуказанном выходе, что изменение new_list
не пострадал от Old_List
Поскольку мы используем функцию копирования для копирования списка.
Теперь давайте посмотрим пример, где операция неглубокого копирования не удастся, потому что она не копирует элементы в исходном объекте рекурсивно.
import copy old_list = [[1, 2], [3, 4]] new_list = copy.copy(old_list) new_list[0].append(10) print("new_list items : ", new_list) print("old_list items : ", old_list)
Выход приведен выше пример копирования Python:
new_list items : [[1, 2, 10], [3, 4]] old_list items : [[1, 2, 10], [3, 4]]
Выход ясно предлагает, чтобы нам нужна отдельная операция для глубокой копии объектов.
Python Deep Copy
Мы всегда должны использовать Deepcopy (x)
Функция с объектами, такими как список списков, так что объекты копируются рекурсивно. Изменим вышеприведенный пример неглубокого копирования и используйте функцию глубокой копии и проверьте выходные данные. Я также добавил еще несколько добавок и удалять операции в программу.
import copy list_of_list = [[1, 2], [3, 4], ["A", "B"]] # python deep copy new_list_of_list = copy.deepcopy(list_of_list) new_list_of_list[0].append(10) new_list_of_list[1].remove(3) list_of_list[2].append("C") print("list_of_list items : ", list_of_list) print("new_list_of_list items : ", new_list_of_list)
Ниже приведены изображение показывает вывод операции Python Deep Copy.
Обратите внимание, что этот метод медленнее, чем мелкое копирование по очевидным причинам, поэтому используйте его только тогда, когда это действительно требуется. Также глубокая копия займет больше памяти, если объекты внутри также скопированы, поэтому используйте его с умом и только если по-настоящему требуется.
Это все о копии Python Copy и Python Deep Copy.
Ссылка: Официальная документация