В чем разница между изменяемыми и неизменяемыми типами в Python?

Ответ

Изменяемые (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'