В чем разница между списком и кортежем в Python?

«В чем разница между списком и кортежем в Python?» — вопрос из категории Python, который задают на 35% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основное различие между списком (list) и кортежем (tuple) заключается в изменяемости (mutability), что влечёт за собой различия в использовании, производительности и семантике.

Характеристика Список (list) Кортеж (tuple)
Изменяемость Изменяемый (mutable). Можно добавлять (append, extend), удалять (remove, pop), изменять элементы по индексу. Неизменяемый (immutable). После создания нельзя изменить, добавить или удалить элементы.
Синтаксис Квадратные скобки: [1, 2, 3] Круглые скобки: (1, 2, 3). Для пустого кортежа (), для кортежа из одного элемента нужна запятая: (1,).
Производительность Занимает немного больше памяти, операции могут быть медленнее из-за накладных расходов на изменение размера. Работает быстрее и занимает меньше памяти, так как структура фиксирована и оптимизирована интерпретатором Python.
Хешируемость Не хешируем (не может быть ключом словаря или элементом множества). Хешируем, если все его элементы хешируемы. Может быть ключом словаря или элементом множества.
Семантика (намерение) Используется для однородных коллекций элементов, которые могут меняться (например, список имён, очередь задач). Используется для гетерогенных данных, которые логически группируются вместе и не должны меняться (например, координаты (x, y), запись из БД (id, name, date)).

Примеры на практике:

# Список — для динамической коллекции
todo_list = ['написать код', 'протестировать', 'задеплоить']
todo_list.append('написать документацию')  # Изменение возможно
todo_list[0] = 'спроектировать архитектуру'

# Кортеж — для фиксированной записи или константной группы значений
point = (10, 20)  # Координаты
color = (255, 0, 0, 128)  # RGBA значение
# point[0] = 5  # Вызовет TypeError: 'tuple' object does not support item assignment

# Кортеж как ключ словаря (список не может)
cache = {}
cache[(user_id, date)] = processed_data  # Кортеж хешируем
# cache[[user_id, date]] = data  # Ошибка: unhashable type: 'list'

Вывод: Используйте список, когда коллекция должна меняться. Используйте кортеж для гарантии неизменности данных, для хешируемых коллекций или чтобы передать семантику «записи».