Почему на собеседованиях по Python спрашивают про изменяемые и неизменяемые объекты?

«Почему на собеседованиях по Python спрашивают про изменяемые и неизменяемые объекты?» — вопрос из категории Python, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это фундаментальная концепция 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.