Расскажи про изменяемые и неизменяемые типы данных в Python

«Расскажи про изменяемые и неизменяемые типы данных в Python» — вопрос из категории Python, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Python разделение на изменяемые (mutable) и неизменяемые (immutable) типы — это фундаментальная концепция, влияющая на поведение объектов, передачу аргументов в функции и управление памятью.

Неизменяемые типы (immutable): int, float, str, tuple, bool, frozenset, bytes.

  • После создания объект нельзя изменить. Любая операция, которая выглядит как изменение, на самом деле создает новый объект.
  • Это делает их потокобезопасными и предсказуемыми при использовании в качестве ключей словаря.
    a = "Hello"
    b = a          # `b` ссылается на тот же объект, что и `a`
    a += " World" # Создается НОВЫЙ строковый объект для `a`
    print(a)      # 'Hello World'
    print(b)      # 'Hello' (старый объект не изменился)

Изменяемые типы (mutable): list, dict, set, bytearray, пользовательские классы (по умолчанию).

  • Содержимое объекта можно изменить после создания, не создавая новый объект.
  • Требуют осторожности, особенно при передаче в функции или использовании значений по умолчанию.
    
    def append_to_list(item, target_list=[]):  # ОПАСНО: изменяемый аргумент по умолчанию!
    target_list.append(item)
    return target_list

Лучшая практика — использовать None

def append_to_list_safe(item, target_list=None): if target_list is None: target_list = [] target_list.append(item) return target_list


**Практическое следствие:** При передаче неизменяемого объекта в функцию вы не можете изменить оригинал. При передаче изменяемого — можете, что может быть как полезным (изменение коллекции на месте), так и источником трудноуловимых багов.