Ответ вслух Junior Типы, изменяемость и сравнение спрашивают часто обновлено

Изменяемые и неизменяемые типы Python

Вопрос

Расскажите, чем изменяемые типы отличаются от неизменяемых и как это влияет на код.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «В Python переменная это имя, привязанное к объекту, и присваивание просто добавляет ещё одну ссылку. Неизменяемые объекты, то есть числа, строки, bytes, кортежи и frozenset, нельзя поменять на месте: s += "x" создаёт новую строку и перепривязывает имя.

Что должно прозвучать в ответе

  • Переменная хранит ссылку на объект, присваивание не копирует

  • Неизменяемые: числа, 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 ошибок.

Термины по теме