Список: изменение и перебор
Уроки курсаСписок: изменение и перебор
Изменение элемента по индексу и перебор списка циклом for
Методы append, insert, remove и pop добавляют и удаляют элементы. Но иногда нужно не добавить новый элемент, а заменить уже существующий — исправить опечатку или обновить задачу. Для этого используется присваивание по индексу.
Синтаксис простой: lst[i] = new_value. Никакого метода — просто указываете индекс и записываете новое значение.
tasks = ["купить хлеб", "позванить врачу", "сделать зарядку"]
tasks[1] = "позвонить врачу" # исправляем опечатку
print(tasks)
# ['купить хлеб', 'позвонить врачу', 'сделать зарядку']
Список изменился на месте: элемент под индексом 1 заменён, остальные не сдвинулись. Длина списка при этом не меняется — замена, а не вставка.
Важно: индекс должен существовать. Если список из трёх элементов, допустимые индексы — 0, 1, 2 (и -1, -2, -3 для отрицательных). Попытка записать по несуществующему индексу даст IndexError:
tasks = ["купить хлеб", "позвонить врачу"]
tasks[5] = "новая задача" # IndexError: list assignment index out of range
Это та же ошибка, что при чтении по несуществующему индексу — Python одинаково реагирует на выход за границы при чтении и при записи.
Теперь о переборе. До этого момента мы обращались к конкретным элементам через индекс. Но часто нужно пройтись по всему списку — вывести каждую задачу, проверить каждый элемент. Для этого используется цикл for.
tasks = ["купить хлеб", "позвонить врачу", "сделать зарядку"]
for task in tasks:
print(task)
# купить хлеб
# позвонить врачу
# сделать зарядку
Конструкция for task in tasks: на каждой итерации берёт следующий элемент списка и присваивает его переменной task. Количество итераций равно длине списка — Python сам останавливается, когда элементы заканчиваются.
Здесь task — это просто имя переменной, можно назвать её как угодно. Главное, что на каждом шаге цикла она содержит текущий элемент, а не его индекс.
Это отличается от того, как вы использовали for раньше с range(): там переменная получала числа от 0 до n-1. Здесь переменная получает сами элементы — строки, числа или что угодно, что лежит в списке.
Если нужно и вывести элемент, и знать его порядковый номер, проще всего завести отдельный счётчик:
tasks = ["купить хлеб", "позвонить врачу", "сделать зарядку"]
n = 1
for task in tasks:
print(f"{n}. {task}")
n += 1
# 1. купить хлеб
# 2. позвонить врачу
# 3. сделать зарядку
Такой приём — ручной счётчик внутри цикла — работает с любым списком и не требует ничего нового.
