Как сделать копию списка python

Обновлено: 03.07.2024

Иногда необходимо повторно использовать любой объект, поэтому методы копирования всегда очень полезны. Python на своем языке предлагает несколько способов для достижения этой цели. Эта конкретная статья направлена на демонстрацию метода копирования, присутствующего в списке. Поскольку список широко используется, следовательно, его копия также необходима.

Syntax : list.copy()

Parameters :
None

Returns :
Returns a shallow copy of a list.
Shallow copy means the any modification in new list won’t be reflected to original list

Код № 1: Демонстрация работы list.copy ()

lis1 = [ 1 , 2 , 3 , 4 ]

print ( "The new list created is : " + str (lis2))

print ( "The new list after adding new element : " + str (lis2))

print ( "The old list after adding new element to new list : " + str (lis1))

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

Техника мелкого копирования:

  • Использование copy.copy ()
  • Использование list.copy ()
  • Используя нарезку

Код № 2: Демонстрация техники мелкого и глубокого копирования

lis1 = [ 1 , 2 , 3 , 4 ]

print ( "The new list created using copy.copy() : " + str (lis2))

print ( "The new list created using list.copy() : " + str (lis3))

print ( "The new list created using slicing : " + str (lis4))

print ( "The old list after adding new element to new list : " + str (lis1))

print ( "The new list created using copy.deepcopy() : " + str (lis2))

print ( "The new list created using = : " + str (lis3))

print ( "The old list after adding new element to new list : " + str (lis1))

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

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

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

Разницу между copy() и deepcopy() иллюстрирует пример:

В случае с deepcopy() была создана копия вложенного списка, copy() этого не делает.

Отсутствие переменной у списка вовсе не изменяет ситуацию:

Оператор is проверяет проверяет ссылаются ли две переменные на один объект, оператор == проверяет равенство значений.

С помощью функций модуля copy можно копировать объекты собственных классов:

Как мы видим, несмотря на то, что объекты a и b разные, поле lst обоих ссылается на один и тот же список. Чтобы при копировании объекта список был также скопирован, следует использовать функцию deepcopy().

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

Статьи

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

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

Copy модуль

Зачем нам нужен модуль Copy Python?

В Python все представлено с помощью объектов. Поэтому во многих случаях нам может потребоваться прямое копирование объектов.

В этих случаях мы не можем использовать оператор присваивания напрямую.

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

Следующий пример иллюстрирует эту проблему с помощью изменяемого объекта общего списка.

Как видите, поскольку обе переменные указывают на один и тот же объект, при изменении b изменяется и a !

Модуль Copy в Python является частью стандартной библиотеки и может быть импортирован с помощью следующего оператора:

Теперь в этом модуле мы можем выполнять в основном два типа операций:

  • Мелкая копия или Shallow;
  • Глубокая копия или Deep.

Мелкая копия или Shallow

Этот метод используется для выполнения операции неглубокого копирования.

Синтаксис вызова этого метода:

Это сделает две вещи:

  • Создаст новый объект;
  • Вставит все ссылки на объекты, найденные в исходном объекте.

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

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

Чтобы проиллюстрировать первый пункт, мы попробуем это с помощью простого списка целых чисел (без вложенных объектов!)

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

Возьмем другой случай, когда наш объект представляет собой список списков.

old_list new_list что были затронуты и old_list и new_list !

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

Глубокая копия или Deep copy

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

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

Давайте возьмем наш старый пример и попробуем использовать Deep копирование для решения нашей проблемы.

Обратите внимание, что старый список не изменился. Поскольку все объекты были скопированы рекурсивно.

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