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

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

Тренажер по Python

В этом модуле мы разберем одну из самых важных и часто вызывающих ошибки тем в Python — копирование списков. Вы узнаете, чем отличается создание новой переменной через присваивание (алиас) от реального создания копии данных. Мы изучим методы поверхностного копирования (shallow copy), такие как срез и метод .copy(), а также разберем модуль copy и функцию deepcopy() для работы с вложенными списками. Понимание этих механизмов необходимо, чтобы избежать ситуаций, когда изменение одной переменной внезапно меняет данные в другой.

Список тем

1. Способы взаимодействия со списками

id: 40009_task1

Сопоставьте синтаксис Python с тем, что именно происходит в памяти компьютера при выполнении этого кода.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Создается ссылка (alias) на существующий объект
Создается поверхностная копия (новый объект)
Создается полная (глубокая) копия, включая вложенные объекты
new_list = old_list
new_list = old_list[:]
new_list = copy.deepcopy(old_list)
Сообщения
Проверить
Показать подсказку

2. Создание поверхностной копии

id: 40009_task2

Заполните пропуски, чтобы создать копию списка `fruits` двумя разными способами: используя срез и встроенный метод списков.

Заполните пропуски
fruits = ['apple', 'banana', 'cherry']

# Способ 1: Использование среза
basket_1 = fruits[input1S]

# Способ 2: Использование метода списка
basket_2 = fruits.input2S
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Что произойдет при присваивании?

id: 40009_task3

Внимательно проанализируйте код. Мы создаем `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. Исправьте ошибку резервного копирования

id: 40009_task4

Программист хотел сохранить оригинальный список `original_data` в переменную `backup`, прежде чем удалять из него элементы. Однако, резервная копия тоже пострадала. Исправьте строку создания `backup`, чтобы это была настоящая копия.

Найдите ошибку и исправьте
original_data = [1, 2, 3, 4, 5]
 
# Делаем резервную копию
backup = original_data
 
original_data.pop() # Удаляем последний элемент
print(f"Original: {original_data}, Backup: {backup}")
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Ссылка или новый объект?

id: 40009_task5

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

Перетяните элементы в соответствующие блоки
Создает ссылку (Alias)
Создает новый объект
b = a
b = a[:]
b = a.copy()
b = list(a)
import copy; b = copy.copy(a)
Сообщения
Проверить
Показать подсказку

6. Коварство вложенных списков

id: 40009_task6

Мы создали поверхностную копию списка `matrix`. Затем изменили элемент внутри вложенного списка. Что выведет код? Напишите результат точно в формате списка Python.

Что должно получиться?
matrix = [[1, 2], [3, 4]]
matrix_copy = matrix.copy()

# Изменяем элемент во вложенном списке
matrix[0][0] = 99

print(matrix_copy[0])
Сообщения
Проверить
Показать подсказку

7. Глубокое копирование

id: 40009_task7

Чтобы создать полностью независимую копию списка с вложенными элементами, нужно использовать модуль `copy`. Заполните пропуски, чтобы импортировать модуль и использовать правильную функцию.

Заполните пропуски
import input1S

nested_list = [[1, 2], [3, 4]]

# Создаем полную (глубокую) копию
safe_list = input2S.input3S(nested_list)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Соберите скрипт глубокого копирования

id: 40009_task8

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

Перетяните в правильном порядке строки из одного блока в другой
import copy
data = [1, [2, 3]]
full_copy = copy.deepcopy(data)
full_copy = data.copy()
data[1][0] = 500
print(full_copy)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

9. Выбор правильного инструмента

id: 40009_task9

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

Нужно правильно расставить в пропуски предложенные варианты
import copy

simple = [1, 2, 3]
nested = [[1, 2], [3, 4]]

# 1. Нужна просто ссылка (второе имя) для simple
alias = input1S

# 2. Нужна независимая копия простого списка simple
shallow = input2S

# 3. Нужна полная независимая копия вложенного списка nested
deep = input3S
simple
simple.copy()
copy.deepcopy(nested)
nested.copy()
copy.copy(simple)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Python: запуск кода в браузере

id: 40009_compiler
🐍
Запустить тренажёр (Python)
НайтиКурс.Ру