Ответ
Основное различие между списком (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'
Вывод: Используйте список, когда коллекция должна меняться. Используйте кортеж для гарантии неизменности данных, для хешируемых коллекций или чтобы передать семантику «записи».