Код БарсикОсновы Python
Основы Python›C12 · Теория

Теория · C12

Изменение списков и копии

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

РАЗБИРАЕМ ПО ШАГАМ

От идеи к работающему коду

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

Сразу к запуску примера ↓
Барсик изменяет копию набора, сохраняя исходные данные.
Барсик изменяет копию набора, сохраняя исходные данные.
  1. 1Исходный список
  2. 2Изменение или копия
  3. 3Проверка результата

1. Добавление и удаление

append добавляет один элемент в конец списка. remove удаляет первое совпадающее значение, а pop удаляет элемент по индексу и возвращает его. Без аргумента pop берёт последний.

remove вызовет ValueError, если значения нет. pop нельзя использовать с пустым списком. Перед удалением проверь условие, которое делает операцию допустимой.

Python
items = ["Хлеб", "Молоко"]items.append("Яблоки")if "Молоко" in items:    items.remove("Молоко")last = items.pop()print(items)print(last)

2. Два имени могут указывать на один список

Присваивание copy = original не создаёт новый список. Два имени будут ссылаться на один объект: изменение через любое имя видно через другое.

original.copy() создаёт отдельный внешний список. Для плоского списка чисел этого достаточно. Во вложенных данных такая копия остаётся поверхностной: внутренние списки всё ещё общие.

Python
original = [3, 1, 4]copy = original.copy()copy.remove(min(copy))print("Исходный:", original)print("Результат:", copy)

3. Строим новый результат

Чтобы перевернуть список без reverse, можно проходить индексы в обратном порядке и добавлять элементы в новый список. Исходник остаётся неизменным.

Такой подход удобен и при фильтрации: вместо опасного удаления во время прохода создаём новый список только из нужных значений.

Python
original = [10, 20, 30]reversed_items = []for index in range(len(original) - 1, -1, -1):    reversed_items.append(original[index])print(reversed_items)print(original)

4. Почему удаление в цикле пропускает элементы

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

Если требуется удалить каждый второй элемент, сначала договоримся о номерах: убираем 2-й, 4-й и далее. Значит сохраняем индексы 0, 2, 4. Срез [::2] создаёт подходящий новый список без изменения исходного.

Python
items = ["А", "Б", "В", "Г", "Д"]kept = []for index in range(0, len(items), 2):    kept.append(items[index])print(kept)print(items[::2])

Где легко ошибиться

  • Ожидать независимую копию после b = a.
  • Использовать результат append как список: метод возвращает None.
  • Удалять элементы из списка в том же цикле, который его перебирает.
Проверь понимание: Если b = a, изменит ли b.append(5) список a?

Да. Оба имени указывают на один список. Для независимого плоского списка нужна a.copy().

Копия списка

Запусти пример. Затем измени код или входные данные и проверь, как меняется вывод.

Пример входных данных

Ввод не нужен

Ожидаемый вывод

['ключ', 'карта', 'фонарь']
['ключ', 'карта']
main.pyPython · можно менять код

Подготавливаем редактор…

Загрузка Python…

Каждый ответ — с новой строки.

Твой вывод

Здесь появится результат запуска.

Дальше — самостоятельные задачи

  1. Перевернуть список циклом без reverse
  2. Удалить один минимальный элемент, сохранив исходник
  3. Удалить каждый второй элемент без пропусков