Ответ
Изменяемые (mutable) типы данных — это объекты, внутреннее состояние которых можно изменить после их создания. Неизменяемые (immutable) типы данных — это объекты, которые нельзя изменить после создания. Любая операция, которая "модифицирует" такой объект, на самом деле создает новый.
Примеры типов данных
-
Неизменяемые (immutable):
int
,float
,complex
,bool
str
tuple
frozenset
-
Изменяемые (mutable):
list
dict
set
bytearray
Ключевые отличия на практике
1. Изменение объекта "на месте"
Изменяемый объект можно модифицировать, не создавая новый, что эффективно по памяти.
# list - изменяемый
my_list = [1, 2, 3]
print(f"ID до изменения: {id(my_list)}")
my_list.append(4)
print(f"ID после изменения: {id(my_list)}") # ID объекта не изменился
print(my_list) # [1, 2, 3, 4]
Попытка изменить неизменяемый объект приведет к созданию нового объекта в памяти.
# str - неизменяемый
my_string = "hello"
print(f"ID до изменения: {id(my_string)}")
my_string = my_string + " world"
print(f"ID после изменения: {id(my_string)}") # ID объекта изменился
print(my_string) # "hello world"
2. Хешируемость
Только неизменяемые объекты могут быть использованы в качестве ключей словаря или элементов множества (set
), так как их хэш-значение остается постоянным на протяжении всей их жизни.
my_dict = {}
immutable_key = (1, 2) # tuple - неизменяемый
mutable_key = [1, 2] # list - изменяемый
my_dict[immutable_key] = "value" # OK
try:
my_dict[mutable_key] = "value"
except TypeError as e:
print(e) # unhashable type: 'list'