Что такое списки и кортежи в Python: основные различия и примеры

Содержание

  1. 1. Что такое списки и кортежи в Python
  2. 2. Главное отличие: изменяемость данных
  3. 3. Как создавать списки и кортежи в Python
  4. 4. Методы работы со списками и кортежами
  5. 5. Когда использовать список, а когда кортеж
  6. 6. Внутреннее устройство: как Python хранит списки и кортежи
  7. 7. Хешируемость: почему кортежи можно использовать как ключи словарей
  8. 8. Заключение
Нужна помощь в программировании?
Обратитесь к нашим экспертам!
Хотите работать удалённо?
Становитесь экспертом Ворк24!

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

Статья адресована программистам, которые автоматизируют процессы, обрабатывают массивы информации или строят веб-сервисы. Python Software Foundation (2024) подтверждает: списки и кортежи входят в число базовых типов, на которых строится большинство проектов.

Что такое списки и кортежи в Python

Списки (list) и кортежи (tuple) — упорядоченные коллекции для хранения нескольких элементов в одной переменной. Оба типа поддерживают индексацию: каждый элемент получает порядковый номер, начиная с 0.

Списки в Python создаются квадратными скобками:

cities = [‘Москва’, ‘Берлин’, ‘Токио’]
numbers = [10, 20, 30, 40]

Кортежи оформляются круглыми скобками:

coordinates = (55.7558, 37.6173)
colors = (‘red’, ‘green’, ‘blue’)

Обе структуры хранят данные любого типа: числа, строки, вложенные коллекции. Доступ к элементу — через индекс:

print(cities[0]) # Москва
print(coordinates[1]) # 37.6173

Общие черты списков и кортежей Python:

  • поддерживают срез (извлечение части элементов);
  • сохраняют порядок добавления;
  • допускают вложенность;
  • позволяют итерацию (перебор в цикле).

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

Главное отличие: изменяемость данных

Центральное различие списка и кортежа Python — возможность модификации содержимого после инициализации.

Списки поддерживают операции модификации. Вы свободно вставляете новые элементы, убираете существующие, переписываете значения:

tasks = [‘отчёт’, ‘звонок’, ‘встреча’]
tasks[1] = ‘письмо’ # замена второго элемента
tasks.append(‘анализ’) # вставка в конец
print(tasks) # [‘отчёт’, ‘письмо’, ‘встреча’, ‘анализ’]

Кортежи блокируют любые изменения. Содержимое фиксируется в момент создания:

settings = (800, 600, ‘fullscreen’)
settings[0] = 1024 # TypeError: ‘tuple’ object does not support item assignment

Интерпретатор сгенерирует исключение при попытке модификации.

Главное отличие изменяемость данных.png

Практические последствия того, чем отличается список от кортежа Python:

1. Эффективность использования ресурсов. Кортеж потребляет на 20–30% меньше оперативной памяти. Интерпретатор избегает резервирования дополнительного пространства под будущие модификации.

from sys import getsizeof
data_list = [1, 2, 3, 4, 5]
data_tuple = (1, 2, 3, 4, 5)
print(getsizeof(data_list)) # 104 байта
print(getsizeof(data_tuple)) # 80 байтов

2. Защита от непреднамеренных ошибок. Кортеж предотвращает случайное изменение критичных данных. Конфигурационные параметры, математические константы, географические координаты остаются стабильными на протяжении выполнения скрипта.

3. Совместимость со словарями. Только неизменяемые объекты годятся для роли ключей. Изменяемость списков исключает такое применение.

📍Запомните!

Фиксированные данные храните в кортеже. Динамические коллекции требуют списка.

Как создавать списки и кортежи в Python

Синтаксис инициализации списков Python — примеры:

#Литерал пустой коллекции
empty = []

#Прямое перечисление значений
fruits = [‘яблоко’, ‘груша’, ‘слива’]

#Конструктор list() из итерируемого объекта
numbers = list(range(5)) # [0, 1, 2, 3, 4]

#List comprehension — генерация на лету
squares = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]

Способы объявления кортежей Python — примеры:

#Пустая конструкция
empty = ()

#Инициализация с данными
point = (10, 20)

#Функция tuple() преобразует последовательность
letters = tuple(‘abc’) # (‘a’, ‘b’, ‘c’)

#Одиночный элемент — обязательна завершающая запятая
single = (42,) # без запятой интерпретатор видит скобки группировки

⚠️Это важно!

Одноэлементный кортеж требует запятой после значения. Python иначе трактует круглые скобки как оператор группировки в математических выражениях, а не маркер типа tuple.

not_tuple = (100) # тип int, скобки игнорируются
is_tuple = (100,) # тип tuple благодаря запятой

Обе структуры поддерживают распаковку:

x, y, z = [1, 2, 3]
name, age = (‘Алексей’, 30)

Количество переменных слева обязано совпадать с числом элементов справа, иначе интерпретатор выбросит ValueError.

Методы работы со списками и кортежами

Списки предоставляют широкий набор методов для изменения:

табличка.png

Примеры списков Python с методами:

tasks = [‘код’, ‘тест’]
tasks.append(‘деплой’) # [‘код’, ‘тест’, ‘деплой’]
tasks.insert(1, ‘ревью’) # [‘код’, ‘ревью’, ‘тест’, ‘деплой’]
tasks.remove(‘тест’) # [‘код’, ‘ревью’, ‘деплой’]
last = tasks.pop() # ‘деплой’, tasks = [‘код’, ‘ревью’]

Кортежи имеют только два метода — из-за неизменяемости:

numbers = (1, 2, 2, 3, 2)
print(numbers.count(2)) # 3 — сколько раз встречается 2
print(numbers.index(3)) # 3 — индекс первого вхождения 3

Ниже — общие операции для обеих структур.

Общие операции для обеих структур.png

💡Это интересно!

Срез не изменяет исходную коллекцию, а создаёт новую. Это работает одинаково для списков и кортежей.

Когда использовать список, а когда кортеж

Список выбирайте, если:

  • данные будут изменяться (добавление, удаление, сортировка);
  • работаете с динамическими коллекциями (список задач, история операций);
  • нужны встроенные методы изменения (append, remove, sort).

Кортеж используйте, если:

  • данные фиксированы и не должны меняться (координаты, настройки, константы);
  • нужен ключ для словаря или элемент множества;
  • важна производительность и экономия памяти при больших объёмах;
  • передаёте неизменяемый набор параметров в функцию.

Примеры списков Python в реальных задачах:

#Динамический список участников
participants = [‘Анна’, ‘Борис’]
participants.append(‘Виктор’)
participants.remove(‘Анна’)

#Обработка очереди заказов
orders = [101, 102, 103]
current = orders.pop(0) # забрали первый заказ

Примеры кортежей Python в реальных задачах:

#Географические координаты
moscow = (55.7558, 37.6173)

#Конфигурация приложения
config = (‘localhost’, 8080, True)

#Ключи словаря с составными данными
sales = {
(‘январь’, 2024): 150000,
(‘февраль’, 2024): 180000
}

#Возврат нескольких значений из функции
def get_user_info():
return (‘Пётр’, 28, ‘developer’)
name, age, role = get_user_info()

✅ Чек-лист выбора:

  1. Данные изменятся в процессе работы? → список.
  2. Нужна защита от случайного изменения? → кортеж.
  3. Используете как ключ словаря? → кортеж.
  4. Производительность критична? → кортеж.
  5. Нужны методы вроде sort() или append()? → список.

Внутреннее устройство: как Python хранит списки и кортежи

Механизм хранения данных в памяти раскрывает причины разницы между списком и кортежем Python. В частности, в скорости их работы.

CPython (эталонная реализация интерпретатора) хранит обе коллекции как массивы указателей. Сами объекты располагаются в разных участках памяти — структура содержит только адреса. При удалении элемента из списка исчезает ссылка на объект. Сам объект сохраняется, пока на него указывают другие переменные.

Принципиальная разница — в стратегии выделения памяти. Список резервирует место впрок, чтобы минимизировать дорогостоящие операции перераспределения. Размер растёт по формуле: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88…

При вставке девятого элемента в восьмиместный список интерпретатор сразу выделяет 16 позиций. Из них заняты 9, остальные 7 ждут будущих вставок. Метод append() выигрывает в скорости, но расходует больше оперативной памяти.

Внутреннее устройство как Python хранит списки и кортежи.png

Кортежи избегают избыточного резервирования — размер точно соответствует числу элементов. Интерпретатор Python применяет агрессивные оптимизации. Пустые кортежи реализованы как синглтон — в процессе живёт единственный экземпляр, все переменные ссылаются на один адрес. Экономия памяти и моментальная инициализация.

Удалённые кортежи размером до 20 элементов попадают в пул переиспользования. Интерпретатор не возвращает память операционной системе, а сохраняет блок для будущих аллокаций такого же размера. Создание нового кортежа переиспользует готовый блок. Механизм снижает фрагментацию heap и ускоряет инициализацию на 10–15% относительно списков.

📌Важный нюанс!

Неизменяемость кортежа распространяется только на набор ссылок. Если кортеж включает список, заменить ссылку нельзя, но модифицировать содержимое списка разрешено. Такой кортеж теряет хешируемость — его запрещено применять ключом словаря.

Для списков аналогичная оптимизация действует лишь для пустых экземпляров. Изменяемость блокирует переиспользование непустых списков — содержимое двух коллекций одинакового размера может радикально различаться.

Хешируемость: почему кортежи можно использовать как ключи словарей

Хешируемость — свойство объекта иметь неизменное хеш-значение на протяжении всей жизни. Хеш-функция преобразует объект в целое число фиксированной длины. Python использует хеши для быстрого поиска в словарях и множествах.

Кортежи — хешируемые объекты. Они неизменяемы, поэтому их хеш-значение вычисляется один раз при создании и больше не меняется. Это позволяет использовать кортежи как ключи словарей и элементы множеств.

Списки — нехешируемые. Их содержимое можно изменить, что сделало бы хеш-значение неактуальным. Если бы Python пересчитывал хеш при каждом изменении списка, это сильно замедлило бы работу программы — пришлось бы постоянно обновлять ссылки в словарях.

⚠️ Обратите внимание на условную хешируемость кортежей. Кортеж хешируем только если все его элементы хешируемы. Если кортеж содержит список, словарь или множество, попытка вычислить хеш вызовет ошибку TypeError: unhashable type.

Хешируемые типы в Python: int, float, str, bool, frozenset, tuple (если все элементы хешируемы). Нехешируемые: list, dict, set. Пользовательские классы хешируемы по умолчанию — их хеш вычисляется через id() и не меняется.

Словари и множества хранят данные в хеш-таблицах. Когда вы добавляете пару ключ-значение в словарь, Python вычисляет хеш ключа и использует его для определения позиции в памяти. Поиск по хешу выполняется за O(1) — константное время, независимо от размера словаря. Если бы ключи могли меняться, позиция в хеш-таблице стала бы неверной, и поиск сломался бы.

О практическом применении

Храните в кортежах составные ключи для словарей — например, координаты точек на карте, комбинации параметров запросов, идентификаторы с метаданными. Кортежи гарантируют, что ключ не изменится случайно и словарь сохранит целостность.

Заключение

Списки и кортежи Python решают задачу упорядоченного хранения коллекций. Список предоставляет набор методов модификации — append(), insert(), remove(), pop(). Кортеж блокирует изменения, экономит память, поддерживает хеширование для применения в качестве ключей словарей.

Применяйте список там, где элементы вставляются, удаляются, сортируются. Выбирайте кортеж для неизменяемых наборов: GPS-координат, настроек конфигурации, композитных ключей словарей.

Архитектура памяти объясняет преимущество в производительности: списки выделяют ячейки с запасом для будущих вставок, кортежи задействуют пул переиспользования освобождённых блоков.

Фундаментальное различие — изменяемость против неизменяемости. Понимание внутреннего устройства и хешируемости помогает выбрать правильную структуру для конкретной задачи.

Вам нужна биржа фриланса для новичков или требуются разработчики сайтов?

Комментарии

Нет комментариев
Не можешь разобраться в этой теме?
Обратись за помощью к фрилансерам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 1 дня
Безопасная сделка
Прямой эфир