Ответ
Основное различие между списком (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 # А это НЕ РАБОТАЕТ! Список — манда с ушами для ключа.
Итог, блядь: хочешь ковыряться и менять — бери список. Нужна гарантия, что нихуя не сдвинется с места, или нужен ключ для словаря — твой выбор кортеж. Всё просто, как три копейки.