Что такое mutable и immutable объекты?

immutable-объекты (неизменяемые) после создания нельзя поменять: любая «изменяющая» операция создаёт новый объект (int, float, bool, str, tuple, frozenset). mutable-объекты (изменяемые) можно менять на месте: меняется состояние, но ссылка на объект остаётся той же (list, dict, set и большинство пользовательских классов).
Подробный ответ

Immutable (неизменяемый) объект — после создания его значение поменять нельзя; можно только создать новый объект и переназначить ссылку.

Mutable (изменяемый) объект — его состояние можно изменять без создания нового объекта: добавлять/удалять элементы, менять содержимое.

В Python всё — объект, у каждого есть тип, идентичность (адрес в памяти) и значение; именно тип решает, допускает ли он изменение значения.

К встроенным неизменяемым типам (immutable) относятся:

  1. числа: int, float, complex, bool;

  2. строки: str;

  3. кортежи: tuple;

  4. неизменяемые множества: frozenset.

Пример со строкой:

s = "hi"
t = s
s += "!"
# s теперь указывает на НОВУЮ строку "hi!"
# t по‑прежнему указывает на "hi"

Строка не меняется «внутри»: создаётся новый объект, а переменная переназначается на него.

К изменяемым (mutable) встроенным типам относятся:

  1. списки: list;

  2. словари: dict;

  3. множества: set;

  4. многие пользовательские классы.

Пример со списком:

items = [1, 2, 3]
other = items
items.append(4)
# и items, и other теперь указывают на один и тот же список [1, 2, 3, 4]

Мы изменили существующий список, новый объект не создавался; все ссылки на него видят изменения.

Почему это важно в коде?

Если две переменные указывают на один mutable-объект, изменения через одну переменную видны через другую. Для immutable-объектов переназначение одной переменной не затрагивает остальные ссылки — создаётся новый объект.

При передаче аргументов в функции: если передать mutable (список) и менять его внутри, изменения будут видны снаружи; если передать immutable (число, строку) и «изменять» его, на самом деле вы создаёте новый объект, а внешняя переменная не меняется.

def add_item(lst):
    lst.append(1)

data = []
add_item(data)
# data == [1]

def add_one(x):
    x += 1

n = 10
add_one(n)
# n по‑прежнему 10

Классическая ловушка: значения по умолчанию

Из‑за изменяемости списков и словарей опасно использовать их как значения по умолчанию в параметрах функций: один и тот же список живёт между вызовами и накапливает данные.

На собеседовании важно показать понимание: mutable и immutable напрямую влияют на то, как ведут себя аргументы функций, общие структуры и параметры по умолчанию.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге