Python - Копирование списков

Привет, стремящиеся к мастерству программисты Python! Сегодня мы погрузимся в увлекательный мир копирования списков в Python. Как ваш добрый сосед-преподаватель информатики, я здесь, чтобы провести вас через это путешествие с ясными пояснениями, множеством примеров и, возможно, даже с несколькими шутками по пути. Так что начнем!

Python - Copy Lists

Копирование списка в Python

Прежде чем мы переходим к различным способам копирования списков, давайте сначала поймем, почему нам вообще нужно копировать списки. Представьте себе, что у вас есть список покупок, и вы хотите поделиться им с вашим сожителем. Вы можете отдать им ваш оригинальный список, но что если они решат добавить "шоколад" (кто бы этого не сделал)? Внезапно ваш тщательно спланированный здоровый список покупок под угрозой! Вот тут и приходит на помощь копирование.

В Python, когда вы присваиваете список новой переменной, вы не создаете новый список. Вместо этого вы создаете новую ссылку на тот же список. Давайте посмотрим на это на практике:

original_list = [1, 2, 3, 4, 5]
new_list = original_list

print("Original list:", original_list)
print("New list:", new_list)

new_list.append(6)

print("Original list after modification:", original_list)
print("New list after modification:", new_list)

Вывод:

Original list: [1, 2, 3, 4, 5]
New list: [1, 2, 3, 4, 5]
Original list after modification: [1, 2, 3, 4, 5, 6]
New list after modification: [1, 2, 3, 4, 5, 6]

Сюрприз? Оба списка изменились, потому что на самом деле это один и тот же список в памяти. Вот тут копирование приходит на помощь!

Поверхностное копирование списка в Python

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

Давайте посмотрим, как создать поверхностное копирование:

import copy

original_list = [1, [2, 3], 4]
shallow_copy = copy.copy(original_list)

print("Original list:", original_list)
print("Shallow copy:", shallow_copy)

shallow_copy[1][0] = 'два'

print("Original list after modification:", original_list)
print("Shallow copy after modification:", shallow_copy)

Вывод:

Original list: [1, [2, 3], 4]
Shallow copy: [1, [2, 3], 4]
Original list after modification: [1, ['два', 3], 4]
Shallow copy after modification: [1, ['два', 3], 4]

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

Глубокое копирование списка в Python

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

Вот как создать глубокое копирование:

import copy

original_list = [1, [2, 3], 4]
deep_copy = copy.deepcopy(original_list)

print("Original list:", original_list)
print("Deep copy:", deep_copy)

deep_copy[1][0] = 'два'

print("Original list after modification:", original_list)
print("Deep copy after modification:", deep_copy)

Вывод:

Original list: [1, [2, 3], 4]
Deep copy: [1, [2, 3], 4]
Original list after modification: [1, [2, 3], 4]
Deep copy after modification: [1, ['два', 3], 4]

На этот раз изменение глубокой копии не повлияло на оригинальный список. Он стал полностью независимым!

Копирование списка с использованием синтаксиса среза

Теперь давайте посмотрим на другие способы копирования списков. Один из самых простых методов – использование синтаксиса среза. Это как сказать: "Я хочу копию всего списка от начала до конца."

original_list = [1, 2, 3, 4, 5]
slice_copy = original_list[:]

print("Original list:", original_list)
print("Slice copy:", slice_copy)

slice_copy.append(6)

print("Original list after modification:", original_list)
print("Slice copy after modification:", slice_copy)

Вывод:

Original list: [1, 2, 3, 4, 5]
Slice copy: [1, 2, 3, 4, 5]
Original list after modification: [1, 2, 3, 4, 5]
Slice copy after modification: [1, 2, 3, 4, 5, 6]

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

Копирование списка с использованием функции list()

Другой способ создания копии – использование функции list(). Это как сказать Python: "Создай мне новый список, который выглядит точно так же, как этот."

original_list = [1, 2, 3, 4, 5]
list_copy = list(original_list)

print("Original list:", original_list)
print("List copy:", list_copy)

list_copy.append(6)

print("Original list after modification:", original_list)
print("List copy after modification:", list_copy)

Вывод:

Original list: [1, 2, 3, 4, 5]
List copy: [1, 2, 3, 4, 5]
Original list after modification: [1, 2, 3, 4, 5]
List copy after modification: [1, 2, 3, 4, 5, 6]

Этот метод также создает поверхностную копию списка.

Копирование списка с использованием метода copy()

Наконец, последний, но не менее важный метод – использование метода copy(). Это встроенный метод для списков. Это как если бы список говорил: "Вот, возьми копию меня!"

original_list = [1, 2, 3, 4, 5]
copy_method = original_list.copy()

print("Original list:", original_list)
print("Copy method:", copy_method)

copy_method.append(6)

print("Original list after modification:", original_list)
print("Copy method after modification:", copy_method)

Вывод:

Original list: [1, 2, 3, 4, 5]
Copy method: [1, 2, 3, 4, 5]
Original list after modification: [1, 2, 3, 4, 5]
Copy method after modification: [1, 2, 3, 4, 5, 6]

Этот метод также создает поверхностную копию списка.

Теперь подведем итог всех этих методов в удобной таблице:

Метод Синтаксис Тип копии Примечания
Присваивание new_list = original_list Ссылка Не является истинной копией
Поверхностное копирование copy.copy(original_list) Поверхностное Новый список, те же ссылки на объекты
Глубокое копирование copy.deepcopy(original_list) Глубокое Новый список, новые ссылки на объекты
Синтаксис среза original_list[:] Поверхностное Просто и читабельно
Функция list() list(original_list) Поверхностное Четкое намерение
Метод copy() original_list.copy() Поверхностное Встроенный метод списка

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

И теперь у вас есть это! Вы обладаете знаниями, чтобы копировать списки как профессионал. В следующий раз, когда вам нужно поделиться своим списком покупок, вы будете знать, как сделать копию, не подвергая риску неожиданным добавлениям. Честно кодировать, и愿 ваши списки всегда были идеально скопированы!

Credits: Image by storyset