Что значит изменяемый тип данных
Что проверяют
Понимаете ли модель памяти Python: имя это ссылка на объект, а не коробка со значением. Отсюда растут аргументы по умолчанию, копирование, хэшируемость и добрая половина вопросов про поведение функций.
Как отвечать
Изменяемый тип это тип, объект которого можно поменять на месте: id тот же, содержимое другое. Изменяемые: list, dict, set, bytearray, обычные экземпляры классов. Неизменяемые: int, float, str, tuple, frozenset, bytes.
Разницу проще показать, чем определить:
a = [1, 2]
b = a
b.append(3) # a тоже [1, 2, 3], объект один
s = "ab"
t = s
t += "c" # новая строка, s осталась прежнейДальше назовите три следствия, ради которых вопрос и задают:
- аргумент передаётся как ссылка на объект, поэтому функция может испортить переданный список, а переприсваивание имени внутри функции снаружи не видно;
- ключом словаря и элементом множества может быть только хэшируемый объект, у изменяемых встроенных типов хэша нет;
- значение по умолчанию вычисляется один раз при определении функции и живёт между вызовами, поэтому изменяемый дефолт заменяют на
None.
Где спотыкаются
Считают += безобидным сокращением. Для списка это добавление на месте, для строки и кортежа создание нового объекта. Отсюда классика: t = ([1],) и затем t[0] += [2] список всё-таки удлиняет и при этом бросает TypeError.
Второе: проверяют равенство через is. Небольшие целые и часть строк интерпретатор переиспользует, is иногда случайно истинен, и кандидат делает вывод, что одинаковые значения это один объект. Значения сравнивают через ==.
Третье: называют кортеж гарантией неизменности данных. Неизменяем только набор ссылок, а объекты по этим ссылкам могут быть какими угодно.