Ответ
Это фундаментальная концепция Python, влияющая на поведение кода, производительность и безопасность данных. Понимание мутабельности помогает избежать тонких багов.
Ключевые различия:
- Неизменяемые (immutable) типы:
int,float,str,tuple,bytes,frozenset. При "изменении" создается новый объект. - Изменяемые (mutable) типы:
list,dict,set,bytearray, пользовательские классы (по умолчанию). Объект модифицируется на месте.
Практический пример с последствиями:
# 1. Неожиданное изменение из-за ссылки (mutable)
def append_to_list(value, target=[]): # Опасность: изменяемый аргумент по умолчанию!
target.append(value)
return target
print(append_to_list(1)) # [1]
print(append_to_list(2)) # [1, 2] # Сюрприз! Список сохранился между вызовами.
# Правильно:
def append_to_list_fixed(value, target=None):
if target is None:
target = [] # Создаем новый неизменяемый список каждый раз
target.append(value)
return target
# 2. Хэшируемость и использование в качестве ключа
try:
my_dict = {[1,2]: "value"} # TypeError: unhashable type: 'list'
except TypeError as e:
print(f"Ошибка: {e}") # Изменяемые объекты не могут быть ключами dict.
valid_dict = {(1, 2): "value"} # Кортеж (immutable) — допустимый ключ.
На собеседовании это проверяет, насколько разработчик осознает семантику присваивания (копирование ссылок), побочные эффекты функций и принципы проектирования безопасного API.