Списки в Python
Допустим, вы ведёте список покупок. Можно завести переменную под каждый товар: item1, item2, item3. Но это быстро превращается в кашу: вставить пункт в середину нельзя, посчитать количество товаров нельзя, пройтись по всем подряд тоже. Нужна одна переменная, которая хранит много значений по порядку. Это и есть список.
Python 3.13shopping = ["хлеб", "молоко", "яйца"] print(shopping)['хлеб', 'молоко', 'яйца']
Список (list) — это упорядоченная изменяемая коллекция элементов. Под одним именем лежит сразу несколько значений, у каждого есть своя позиция, и набор можно менять: добавлять, удалять, переставлять.
Из этого определения вытекают четыре свойства, на которые мы будем опираться дальше:
- Порядок сохраняется — элементы лежат в том порядке, в каком вы их добавили
- Список изменяемый — после создания в него можно добавлять и удалять элементы
- Доступ по индексу — к любому элементу можно обратиться по его позиции
- Дубликаты разрешены — одно и то же значение может встречаться несколько раз
Создание списков
Существует несколько способов создания списков в Python:
С помощью квадратных скобок []
Python 3.13# Пустой список empty_list = [] print(empty_list)[]# Список чисел numbers = [1, 2, 3, 4, 5] print(numbers)[1, 2, 3, 4, 5]# Список разных типов данных mixed = [1, "привет", True, 3.14] print(mixed)[1, 'привет', True, 3.14]# Вложенные списки (список списков) matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(matrix)[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
С помощью конструктора list()
Python 3.13# Создание пустого списка empty_list = list() print(empty_list)[]# Создание списка из строки (каждый символ становится элементом) chars = list("Python") print(chars)['P', 'y', 't', 'h', 'o', 'n']# Создание списка из других итерируемых объектов tuple_to_list = list((1, 2, 3)) print(tuple_to_list)[1, 2, 3]set_to_list = list({1, 2, 3}) print(set_to_list)[1, 2, 3]
Доступ к элементам списка
Индексация
В Python индексация начинается с 0, то есть первый элемент имеет индекс 0, второй — 1, и так далее:
Python 3.13fruits = ["яблоко", "банан", "вишня", "груша", "апельсин"] # Получение элементов по индексу first_fruit = fruits[0] print(f"Первый фрукт: {first_fruit}")Первый фрукт: яблоко# Отрицательные индексы для доступа с конца списка last_fruit = fruits[-1] print(f"Последний фрукт: {last_fruit}")Последний фрукт: апельсинsecond_last = fruits[-2] print(f"Предпоследний фрукт: {second_last}")Предпоследний фрукт: груша
Срезы (slices)
Срезы позволяют получить подсписок, указав начальный и конечный индексы:
Python 3.13fruits = ["яблоко", "банан", "вишня", "груша", "апельсин"] # Синтаксис среза: список[начало:конец:шаг] # Начало включается, конец не включается! # Первые три элемента first_three = fruits[0:3] print(f"Первые три фрукта: {first_three}")Первые три фрукта: ['яблоко', 'банан', 'вишня']# То же самое, но начальный индекс можно опустить, если он 0 first_three = fruits[:3] print(f"Первые три фрукта: {first_three}")Первые три фрукта: ['яблоко', 'банан', 'вишня']# Каждый второй элемент every_second = fruits[::2] print(f"Каждый второй фрукт: {every_second}")Каждый второй фрукт: ['яблоко', 'вишня', 'апельсин']# Разворот списка reversed_list = fruits[::-1] print(f"Список в обратном порядке: {reversed_list}")Список в обратном порядке: ['апельсин', 'груша', 'вишня', 'банан', 'яблоко']
Изменение элементов списка
Главное отличие списков от строк: списки изменяемые (mutable). Строку поменять «на месте» нельзя — приходится создавать новую (вспомните урок про строки). А вот элементы списка можно изменять, добавлять и удалять прямо в существующем объекте:
Python 3.13fruits = ["яблоко", "банан", "вишня"] # Изменение элемента fruits[0] = "киви" print(fruits)['киви', 'банан', 'вишня']# Изменение нескольких элементов с помощью среза numbers = [1, 2, 3, 4, 5] numbers[1:4] = [20, 30, 40] print(numbers)[1, 20, 30, 40, 5]# Можно даже заменить несколько элементов на другое количество numbers = [1, 2, 3, 4, 5] numbers[1:4] = [20, 30] print(numbers)[1, 20, 30, 5]
Основные методы списков
Python предоставляет множество встроенных методов для работы со списками:
Добавление элементов
Python 3.13fruits = ["яблоко", "банан"] # Добавление элемента в конец списка fruits.append("вишня") print(fruits)['яблоко', 'банан', 'вишня']# Вставка элемента на определенную позицию fruits.insert(1, "апельсин") print(fruits)['яблоко', 'апельсин', 'банан', 'вишня']# Добавление элементов из другого списка more_fruits = ["груша", "виноград"] fruits.extend(more_fruits) print(fruits)['яблоко', 'апельсин', 'банан', 'вишня', 'груша', 'виноград']# Объединение списков с помощью оператора + combined = fruits + ["ананас", "манго"] print(combined)['яблоко', 'апельсин', 'банан', 'вишня', 'груша', 'виноград', 'ананас', 'манго']
Удаление элементов
Python 3.13fruits = ["яблоко", "банан", "вишня", "апельсин", "банан"] # Удаление элемента по значению (удаляет только первое вхождение) fruits.remove("банан") print(fruits)['яблоко', 'вишня', 'апельсин', 'банан']# Удаление элемента по индексу и возврат его значения removed = fruits.pop(1) print(f"Удален: {removed}")Удален: вишняprint(f"Список после удаления: {fruits}")Список после удаления: ['яблоко', 'апельсин', 'банан']# Если индекс не указан, pop() удаляет и возвращает последний элемент last = fruits.pop() print(f"Последний элемент: {last}")Последний элемент: бананprint(fruits)['яблоко', 'апельсин']# Удаление всех элементов из списка fruits.clear() print(f"Пустой список: {fruits}")Пустой список: []# Оператор del для удаления элементов по индексу или срезу numbers = [1, 2, 3, 4, 5] del numbers[0] print(numbers)[2, 3, 4, 5]del numbers[1:3] print(numbers)[2, 5]
Поиск и подсчет элементов
Python 3.13fruits = ["яблоко", "банан", "вишня", "банан", "груша"] # Проверка наличия элемента в списке print("банан" in fruits)Trueprint("арбуз" in fruits)False# Поиск индекса первого вхождения элемента banana_index = fruits.index("банан") print(f"Индекс первого банана: {banana_index}")Индекс первого банана: 1# Подсчет количества вхождений элемента banana_count = fruits.count("банан") print(f"Количество бананов: {banana_count}")Количество бананов: 2
Сортировка и разворот
Python 3.13# Сортировка списка (изменяет исходный список) numbers = [3, 1, 4, 1, 5, 9, 2] numbers.sort() print(f"Отсортированный список: {numbers}")Отсортированный список: [1, 1, 2, 3, 4, 5, 9]# Сортировка в обратном порядке numbers.sort(reverse=True) print(f"Обратная сортировка: {numbers}")Обратная сортировка: [9, 5, 4, 3, 2, 1, 1]# Если не хотите изменять исходный список, используйте sorted() original = [3, 1, 4, 1, 5] sorted_list = sorted(original) print(f"Оригинал: {original}")Оригинал: [3, 1, 4, 1, 5]print(f"Отсортированная копия: {sorted_list}")Отсортированная копия: [1, 1, 3, 4, 5]
Копирование списков
Это одна из самых частых причин багов у новичков: присваивание списка не создаёт копию, обе переменные указывают на один и тот же объект в памяти. Если изменить список через одну переменную, изменение увидит и другая.

Python 3.13# Создаем список original = [1, 2, 3] # Присваивание не создает копию — обе переменные указывают на один список reference = original reference.append(4) print(f"Оригинал после изменения ссылки: {original}")Оригинал после изменения ссылки: [1, 2, 3, 4]# Правильные способы копирования списка: # 1. Метод copy() copy1 = original.copy() # 2. Использование среза [:] copy2 = original[:] # 3. Функция list() copy3 = list(original) # Проверим, что копии не связаны с оригиналом copy1.append(5) print(f"Оригинал: {original}")Оригинал: [1, 2, 3, 4]print(f"Копия 1: {copy1}")Копия 1: [1, 2, 3, 4, 5]
Практический пример использования списка
Python 3.13# Список студентов и их оценок students = ["Анна", "Иван", "Мария", "Петр", "Елена"] grades = [95, 82, 90, 78, 88] # Нахождение студента с наивысшим баллом highest_score = max(grades) top_student_index = grades.index(highest_score) print(f"Лучший студент: {students[top_student_index]} с оценкой {highest_score}")Лучший студент: Анна с оценкой 95
Проверка понимания
Какой из следующих способов правильно создаст копию списка, не связанную с оригиналом?
