Что означает изменяемость и неизменяемость объектов в Python
Что проверяют
Понимаете ли вы, что это свойство объекта, а не переменной, и знаете ли классические ловушки, которые из него следуют.
Как отвечать
Неизменяемые: числа, строки, кортежи, frozenset, bytes. Изменяемые: списки, словари, множества, большинство своих классов.
Переменная это имя, связанное с объектом. Присваивание меняет связь, а не объект. У изменяемого объекта содержимое можно поменять на месте, у неизменяемого нет: любая «модификация» строки создаёт новую строку.
a = [1, 2]; b = a; b.append(3) # a тоже [1, 2, 3], объект один
s = "abc"; t = s; t += "d" # s остался "abc", создалась новая строкаТри следствия, которые и спрашивают:
- изменяемый аргумент по умолчанию:
def f(x, acc=[])создаёт список один раз при объявлении функции, и он накапливает данные между вызовами. Правильно писатьacc=Noneи создавать внутри; - ключи словаря и элементы множества обязаны быть хешируемыми, поэтому список ключом быть не может, а кортеж может (если внутри нет изменяемых объектов);
- поверхностная копия копирует только верхний уровень:
list(a)даёт новый список с теми же вложенными объектами, для полной копии нуженcopy.deepcopy.
Полезно добавить, что кортеж неизменяем сам, но может содержать список, и тогда содержимое этого списка меняется, а сам кортеж хешируемым быть перестаёт.
Где спотыкаются
Считают, что += у списка и у строки работают одинаково: у списка это изменение на месте, у строки создание нового объекта.
Попадаются на изменяемом значении по умолчанию.
Думают, что кортеж делает содержимое неизменяемым.
Путают is и ==, проверяя равенство значений оператором тождества.