В чем плюсы и минусы tuple и list в Python
Что проверяют
Понимаете ли вы, что разница не только в изменяемости, и знаете ли следствия для хеширования.
Как отвечать
Главное различие: список изменяемый, кортеж нет. Из этого следует всё остальное.
Плюсы кортежа:
- хешируемый, если хешируемы все его элементы. Значит может быть ключом словаря и элементом множества. Список не может никогда;
- чуть компактнее по памяти и быстрее создаётся: размер известен заранее, дополнительной ёмкости под рост не нужно;
- защищает от случайного изменения, что удобно для констант и для значений, передаваемых наружу;
- семантика записи: кортеж хорошо описывает объект с фиксированной структурой, где позиция значима, например пара координат или строка из базы.
Минусы кортежа: нельзя добавить, удалить, отсортировать на месте. Любое изменение это создание нового.
Плюсы списка: динамическая длина, append за амортизированное постоянное время, сортировка и изменение на месте, срезы с присваиванием.
Минусы списка: не хешируется, чуть больше памяти, изменяем, поэтому небезопасен как значение по умолчанию у аргумента функции (классическая ловушка с общим списком между вызовами).
Ловушка, о которой стоит сказать отдельно: неизменяемость кортежа поверхностная. Ссылки внутри менять нельзя, а вот сам объект по ссылке можно:
t = ([1], 2)
t[0].append(3) # работает
hash(t) # TypeError: unhashableКортеж со списком внутри перестаёт быть хешируемым, и в словарь его уже не положить.
По стилю: кортеж для разнородной записи фиксированной длины, список для однородной последовательности переменной длины. Если у полей есть имена, лучше NamedTuple или dataclass(frozen=True), они читаются заметно яснее обращения по индексу.
Где спотыкаются
Считают неизменяемость кортежа глубокой.
Не знают, почему список нельзя использовать как ключ словаря.
Ставят изменяемое значение по умолчанию у аргумента функции.
Выбирают между ними по привычке, а не по смыслу данных.