Изменяемые и неизменяемые типы Python
Вопрос
Расскажите, чем изменяемые типы отличаются от неизменяемых и как это влияет на код.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Переменная хранит ссылку на объект, присваивание не копирует
Неизменяемые: числа, str, bytes, tuple, frozenset; изменяемые: list, dict, set
Операция над неизменяемым создаёт новый объект, изменяемый меняется на месте
Хешируемость: ключами dict и элементами set могут быть только хешируемые
Последствия: изменяемый аргумент по умолчанию, общие вложенные списки, копирование
Кортеж может содержать изменяемый объект и тогда не хешируем
Что могут спросить следом
- Что выведет
t = ([1],); t[0] += [2]? - Почему
strсделали неизменяемым? - Как передаются аргументы в функцию: по ссылке или по значению?
Разбор
Образцовый ответ: «В Python переменная это имя, привязанное к объекту, и присваивание просто добавляет ещё одну ссылку. Неизменяемые объекты, то есть числа, строки, bytes, кортежи и frozenset, нельзя поменять на месте: s += "x" создаёт новую строку и перепривязывает имя. Изменяемые, то есть list, dict, set и обычные пользовательские объекты, меняются на месте, и изменение видно через все ссылки. Отсюда несколько практических следствий. Ключом словаря и элементом множества может быть только хешируемый объект, а это почти всегда неизменяемый. Изменяемое значение по умолчанию в функции создаётся один раз и копит состояние между вызовами. [[0]*3]*3 даёт три ссылки на один список. Если нужна независимая копия, беру copy или deepcopy в зависимости от вложенности. И важная тонкость: кортеж неизменяем, но если внутри список, то он не хешируем и его содержимое меняется. Аргументы передаются как ссылки на объекты, иногда говорят call by sharing: функция может изменить переданный список, но не может перепривязать переменную вызывающего».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.