РАЗБИРАЕМ ПО ШАГАМ
От идеи к работающему коду
Списки можно менять: добавлять элементы, удалять и переставлять. Разберём отличие изменения исходного списка от создания нового, чтобы результат одной операции не ломал другие части программы.
Сразу к запуску примера ↓
- 1Исходный список
- 2Изменение или копия
- 3Проверка результата
1. Добавление и удаление
append добавляет один элемент в конец списка. remove удаляет первое совпадающее значение, а pop удаляет элемент по индексу и возвращает его. Без аргумента pop берёт последний.
remove вызовет ValueError, если значения нет. pop нельзя использовать с пустым списком. Перед удалением проверь условие, которое делает операцию допустимой.
items = ["Хлеб", "Молоко"]items.append("Яблоки")if "Молоко" in items: items.remove("Молоко")last = items.pop()print(items)print(last)2. Два имени могут указывать на один список
Присваивание copy = original не создаёт новый список. Два имени будут ссылаться на один объект: изменение через любое имя видно через другое.
original.copy() создаёт отдельный внешний список. Для плоского списка чисел этого достаточно. Во вложенных данных такая копия остаётся поверхностной: внутренние списки всё ещё общие.
original = [3, 1, 4]copy = original.copy()copy.remove(min(copy))print("Исходный:", original)print("Результат:", copy)3. Строим новый результат
Чтобы перевернуть список без reverse, можно проходить индексы в обратном порядке и добавлять элементы в новый список. Исходник остаётся неизменным.
Такой подход удобен и при фильтрации: вместо опасного удаления во время прохода создаём новый список только из нужных значений.
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] создаёт подходящий новый список без изменения исходного.
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().
