Immutable (неизменяемый) объект — после создания его значение поменять нельзя; можно только создать новый объект и переназначить ссылку.
Mutable (изменяемый) объект — его состояние можно изменять без создания нового объекта: добавлять/удалять элементы, менять содержимое.
В Python всё — объект, у каждого есть тип, идентичность (адрес в памяти) и значение; именно тип решает, допускает ли он изменение значения.
К встроенным неизменяемым типам (immutable) относятся:
числа: int, float, complex, bool;
строки: str;
кортежи: tuple;
неизменяемые множества: frozenset.
Пример со строкой:
s = "hi"
t = s
s += "!"
# s теперь указывает на НОВУЮ строку "hi!"
# t по‑прежнему указывает на "hi"
Строка не меняется «внутри»: создаётся новый объект, а переменная переназначается на него.
К изменяемым (mutable) встроенным типам относятся:
списки: list;
словари: dict;
множества: set;
многие пользовательские классы.
Пример со списком:
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 напрямую влияют на то, как ведут себя аргументы функций, общие структуры и параметры по умолчанию.