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

Ответ

Основное различие между списком (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'

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

Ответ 18+ 🔞

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

Короче, главная фишка — изменяемость. Список — это как твой бардак в комнате: сегодня кинул носки, завтра выкинул пивные банки, послезавтра переставил кресло. Менять можно всё, что влезет. А кортеж — это уже, сука, законсервированная банка огурцов. Закрутил крышку — и всё, нихуя не поменяешь, только смотришь и вздыхаешь.

Так, по пунктам, чтобы не охуеть:

  • Менять можно? Список — да, конечно, ебать копать, append, pop, remove — делай что хочешь. Кортеж — нет, блядь. Создал — и сиди с этим. Попробуешь поменять — получишь TypeError прямо в лицо, как будто тебе вилкой в глаз.
  • Как выглядят? Список — в квадратных скобках: [1, 2, 3]. Кортеж — в круглых: (1, 2, 3). И да, чувак, если кортеж из одного элемента, то запятую ставь, а то питон подумает, что это просто число в скобках: (1,) — вот так правильно. А иначе будет тебе (1) — и это нихуя не кортеж, а просто единица, ядрёна вошь.
  • Скорость и память. Кортеж, блядь, шустрее и компактнее. Ему не надо париться, что его вдруг начнут растягивать или ужимать, он же неизменный. Список — тот ещё распиздяй, всегда готов к переезду, поэтому накладные расходы есть.
  • Хешируемость — это что за хуйня? А это способность быть ключом в словаре. Список — не хешируемый, пидарас шерстяной, его в ключи не пустят. А кортеж — запросто, если внутри у него тоже всё приличное и неизменное. Представь: {(user_id, date): данные} — красота. А со списком так не выйдет, доверия ебать ноль.
  • Смысл, ёпта. Список — это для однородного сборища: список дел, список имён, список ошибок, которые ты накосячил. Кортеж — это когда разные штуки собираются в одну кучку и должны навсегда остаться вместе, как сиамские близнецы: координаты (x, y), запись из базы (id, имя, дата рождения).

Ну и примеры, чтобы совсем пиздец стало понятно:

# Список — живой, дышит, меняется
todo = ['написать код', 'протестировать', 'запустить']
todo.append('вырубить сервер в пятницу вечером')  # Добавили — легко
todo[0] = 'спроектировать архитектуру на салфетке'  # Поменяли — без проблем

# Кортеж — застывшая лава, памятник самому себе
point = (10, 20)  # Координаты точки
color = (255, 0, 0, 128)  # Цвет RGBA
# point[0] = 5  # А вот это НИНАДА! Вызовет ошибку. Всё, приехали.

# Кортеж как ключ в словаре — магия
cache = {}
cache[(user_id, date)] = processed_data  # Работает, потому что кортеж
# cache[[user_id, date]] = data  # А это НЕ РАБОТАЕТ! Список — манда с ушами для ключа.

Итог, блядь: хочешь ковыряться и менять — бери список. Нужна гарантия, что нихуя не сдвинется с места, или нужен ключ для словаря — твой выбор кортеж. Всё просто, как три копейки.