В этом модуле мы разберем одну из самых важных и часто вызывающих ошибки тем в Python — копирование списков. Вы узнаете, чем отличается создание новой переменной через присваивание (алиас) от реального создания копии данных. Мы изучим методы поверхностного копирования (shallow copy), такие как срез и метод .copy(), а также разберем модуль copy и функцию deepcopy() для работы с вложенными списками. Понимание этих механизмов необходимо, чтобы избежать ситуаций, когда изменение одной переменной внезапно меняет данные в другой.
- Модуль 1: Основы синтаксиса Python
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Арифметические операторы (+, -, *, /).
- Целочисленное деление и остаток (// и %).
- Возведение в степень (**).
- Операторы сравнения.
- Логические операторы (and, or, not).
- Операторы присваивания (=, +=, -=).
- Операторы принадлежности (in, not in).
- Операторы идентичности (is, is not).
- Битовые операторы.
- Тернарный оператор.
- Модуль 4: Ввод и вывод данных
- Модуль 5: Условные конструкции
- Модуль 6: Циклы
- Модуль 7: Строки
- Модуль 8: Списки
- Модуль 9: Кортежи
- Модуль 10: Словари
- Модуль 11: Множества
- Модуль 12: Функции
- Модуль 13: Встроенные функции
- Модуль 14: Работа с файлами
- Модуль 15: Обработка исключений
- Модуль 16: Модули и пакеты
- Модуль 17: ООП - Основы
- Модуль 18: ООП - Продвинутый уровень
- Модуль 19: Декораторы
- Модуль 20: Генераторы и итераторы
- Модуль 21: Регулярные выражения
- Модуль 22: Дата и время
- Модуль 23: Математические операции
- Модуль 24: Работа с сетью
- Модуль 25: Асинхронное программирование
- Модуль 26: Многопоточность
- Модуль 27: Тестирование
- Модуль 28: Базы данных
- Модуль 29: Алгоритмы и структуры данных
- Модуль 30: Продвинутые возможности
1. Способы взаимодействия со списками
Сопоставьте синтаксис Python с тем, что именно происходит в памяти компьютера при выполнении этого кода.
new_list = old_listnew_list = old_list[:]new_list = copy.deepcopy(old_list)2. Создание поверхностной копии
Заполните пропуски, чтобы создать копию списка `fruits` двумя разными способами: используя срез и встроенный метод списков.
fruits = ['apple', 'banana', 'cherry']
# Способ 1: Использование среза
basket_1 = fruits[input1S]
# Способ 2: Использование метода списка
basket_2 = fruits.input2S3. Что произойдет при присваивании?
Внимательно проанализируйте код. Мы создаем `list_b`, присваивая ему `list_a`, а затем изменяем `list_b`. Что выведет `print(list_a)`?
list_a = [10, 20, 30]
list_b = list_a
list_b[0] = 999
print(list_a)4. Исправьте ошибку резервного копирования
Программист хотел сохранить оригинальный список `original_data` в переменную `backup`, прежде чем удалять из него элементы. Однако, резервная копия тоже пострадала. Исправьте строку создания `backup`, чтобы это была настоящая копия.
original_data = [1, 2, 3, 4, 5] # Делаем резервную копиюbackup = original_data original_data.pop() # Удаляем последний элементprint(f"Original: {original_data}, Backup: {backup}")5. Ссылка или новый объект?
Распределите выражения Python по двум категориям: те, что создают просто ссылку (новое имя) на существующий список, и те, что создают новый независимый объект списка (копию).
b = ab = a[:]b = a.copy()b = list(a)import copy; b = copy.copy(a)6. Коварство вложенных списков
Мы создали поверхностную копию списка `matrix`. Затем изменили элемент внутри вложенного списка. Что выведет код? Напишите результат точно в формате списка Python.
matrix = [[1, 2], [3, 4]]
matrix_copy = matrix.copy()
# Изменяем элемент во вложенном списке
matrix[0][0] = 99
print(matrix_copy[0])7. Глубокое копирование
Чтобы создать полностью независимую копию списка с вложенными элементами, нужно использовать модуль `copy`. Заполните пропуски, чтобы импортировать модуль и использовать правильную функцию.
import input1S
nested_list = [[1, 2], [3, 4]]
# Создаем полную (глубокую) копию
safe_list = input2S.input3S(nested_list)8. Соберите скрипт глубокого копирования
Составьте программу, которая создает список с подсписком, делает его глубокую копию, изменяет оригинал и доказывает, что копия не изменилась. В наборе есть лишняя строка, создающая поверхностную копию.
import copydata = [1, [2, 3]]full_copy = copy.deepcopy(data)full_copy = data.copy()data[1][0] = 500print(full_copy)9. Выбор правильного инструмента
Заполните пропуски в коде, выбирая правильный способ копирования для каждой ситуации, описанной в комментариях. Перетащите варианты из банка данных.
import copy
simple = [1, 2, 3]
nested = [[1, 2], [3, 4]]
# 1. Нужна просто ссылка (второе имя) для simple
alias = input1S
# 2. Нужна независимая копия простого списка simple
shallow = input2S
# 3. Нужна полная независимая копия вложенного списка nested
deep = input3S