Короткий ответ
list — изменяемая последовательность для данных, которые меняются по ходу работы программы; tuple — неизменяемая последовательность, подходящая для фиксированных наборов значений и в качестве ключей словаря.
Как это работает подробнее
list реализован как динамический массив ссылок, поддерживающий append, insert, удаление элементов — объект можно изменять после создания. tuple хранит тот же набор ссылок, но без методов изменения состава; после создания кортеж нельзя дополнить или сократить.
Пример кода
example.py
point = (10, 20) # tuple: фиксированная пара координат
# point[0] = 11 # TypeError: 'tuple' object does not support item assignment
history = [] # list: будет расти по ходу работы
history.append(point)
history.append((11, 21))
print(history) # [(10, 20), (11, 21)]
mixed = (1, [2, 3]) # кортеж неизменяем, но вложенный список — да
mixed[1].append(4)
print(mixed) # (1, [2, 3, 4])Что использовать на практике
- Практика. tuple удобен для возврата нескольких значений из функции (координаты, пара ключ-значение), для неизменяемых записей и как элемент set/ключ dict, поскольку он хешируем (если хешируемы все его элементы). list используют для коллекций, которые растут, сортируются или фильтруются в процессе работы.
Подводные камни
- Риски. Путают неизменяемость кортежа с неизменяемостью его содержимого: tuple с вложенным list внутри всё равно позволяет изменить этот list, хотя сам кортеж "не меняется". Также забывают, что tuple из одного элемента требует запятой: (1) — это просто число 1, а не кортеж.