Перейти к содержимому
Теория · Списки · урок 1 из 11

Списки

Чему вы научитесь

Чему вы научитесь:

  • хранить ряд значений в списке, читать элементы по индексу и обходить их циклом;
  • добавлять, убирать и сортировать элементы методами списка;
  • отличать второе имя того же списка от его копии;
  • строить таблицы из вложенных списков и не попадаться на список в значении по умолчанию.
Поезд scores из пяти вагонов с плитками 5 4 3 5 4 и табличка 21 в конце пути

Представьте игрушечный поезд с табличкой scores на паровозе. За паровозом едут пять вагонов, и в каждом лежит плитка с оценкой за контрольную: 5, 4, 3, 5 и 4. В конце пути стоит табличка с суммой всех плиток — 21.

Без поезда оценки пришлось бы хранить в пяти отдельных переменных. Тогда сумма перечисляет пять имён, а цикл не может обойти их по очереди. Для ряда значений в Python есть список — упорядоченный набор объектов. Его записывают в квадратных скобках через запятую:

Python
scores = [5, 4, 3, 5, 4]
print(scores)  # [5, 4, 3, 5, 4]
print(len(scores))  # 5
print(scores[0], scores[-1])  # 5 4
total = 0
for score in scores:
    total += score
print(total)  # 21

Давайте разберём программу по строкам:

  1. scores = [5, 4, 3, 5, 4] собирает поезд из пяти вагонов и связывает с ним имя scores.
  2. print(scores) печатает весь список вместе со скобками.
  3. len(scores) считает вагоны: их 5.
  4. scores[0] и scores[-1] берут первый и последний вагон: 5 и 4.
  5. Цикл for едет вдоль поезда и прибавляет каждую плитку к total.
  6. Последний print показывает табличку в конце пути: 21.

Элементы и индексы

Каждое значение в списке называют элементом. Вагоны нумеруются так же, как символы строки: первый — scores[0], последний — scores[-1]. Функция len возвращает число элементов.

Что ещё работает так же, как у строки:

  • цикл for перебирает элементы по порядку, от первого к последнему;
  • индекс за концом списка останавливает программу: scores[5] даёт ошибку IndexError: list index out of range;
  • пустой список [] в условии ложный, как пустая строка.

Список можно изменить

Строку изменить нельзя, а список — изменяемый объект. В поезде можно заменить плитку в любом вагоне или прицепить новые вагоны, и это будет всё тот же поезд. Присваивание по индексу заменяет элемент, и программа дальше работает с тем же списком:

Python
names = ["Ann", "Bob", "Kim"]
names[1] = "Max"
print(names)  # ['Ann', 'Max', 'Kim']
print("Bob" in names, "Kim" in names)  # False True
names += ["Lee", "Zoe"]
print(names[2:])  # ['Kim', 'Lee', 'Zoe']
print(len(names))  # 5

Разберём пример по шагам:

  1. names[1] = "Max" заменяет второй элемент: вместо 'Bob' теперь 'Max'.
  2. print(names) показывает строки внутри списка в одинарных кавычках. Так в выводе видно, что '5' — строка, а 5 — число.
  3. Оператор in проверяет, есть ли значение среди элементов: 'Bob' больше нет, а 'Kim' есть.
  4. names += ["Lee", "Zoe"] прицепляет в конец два новых элемента.
  5. Срез names[2:] работает так же, как срез строки: он даёт новый список, а сам names не меняется.
  6. len(names) теперь возвращает 5.

Этот вопрос часто задают на собеседовании: «Чем список отличается от строки?» Главное отличие — изменяемость. Элемент списка можно заменить на месте, а любая операция над строкой строит новую строку.

Плюс и плюс-равно

Для списков a += b — не то же, что a = a + b. Разница в том, что происходит с самим списком.

Запись a += b

Она дописывает элементы b в конец того же списка a. Поезд остаётся прежним, к нему прицепляют новые вагоны. Так в примере выше вырос список names.

Запись a = a + b

Оператор + между двумя списками, как и между строками, строит новый список: [1, 2] + [3] — это [1, 2, 3]. Затем присваивание связывает имя a с этим новым списком. Старый список при этом не меняется.

Пока у списка одно имя, на экране обе записи дают одинаковый результат.

Разные типы в одном списке

Элементы одного списка могут быть разных типов: [1, "two", 3.0, None]. Здесь аналогия с поездом заканчивается: у настоящего состава вагоны обычно одного вида, а в список можно положить объекты любых типов вперемешку. На практике в списке всё же хранят значения одного типа, чтобы цикл обрабатывал их одинаково.

Частая ошибка

Новый элемент записали по индексу за концом списка:

Python
nums = [10, 20, 30]
nums[3] = 40  # ✗
TEXT
IndexError: list assignment index out of range

Присваивание по индексу заменяет вагон, который уже есть, но новый не прицепляет. В списке из трёх элементов последний индекс — 2, поэтому элемента nums[3] нет. Чтобы добавить элемент в конец, напишите nums += [40].

Главное

  • Список — упорядоченный изменяемый набор объектов в квадратных скобках: [5, 4, 3, 5, 4].
  • Индексы, len, срезы и цикл for работают со списком так же, как со строкой.
  • Присваивание по индексу заменяет существующий элемент, а за концом списка даёт IndexError.
  • a += b дописывает элементы в тот же список, а a + b строит новый.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом