Какие типы данных в Python являются изменяемыми (mutable)?

«Какие типы данных в Python являются изменяемыми (mutable)?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Изменяемые (mutable) типы данных в Python позволяют модифицировать содержимое объекта после его создания без создания нового объекта. Это ключевое отличие от неизменяемых (immutable) типов.

Основные встроенные изменяемые типы:

  1. Список (list)

    my_list = [1, 2, 3]
    my_list.append(4)      # Изменяет исходный список: [1, 2, 3, 4]
    my_list[0] = 99        # Изменяет элемент по индексу: [99, 2, 3, 4]
  2. Словарь (dict)

    my_dict = {'a': 1, 'b': 2}
    my_dict['c'] = 3       # Добавляет новую пару ключ-значение
    my_dict['a'] = 100     # Изменяет значение для ключа 'a'
  3. Множество (set)

    my_set = {1, 2, 3}
    my_set.add(4)          # Добавляет элемент: {1, 2, 3, 4}
    my_set.discard(2)      # Удаляет элемент: {1, 3, 4}
  4. Байтовый массив (bytearray)

    barr = bytearray(b'hello')
    barr[0] = 106          # Изменяет байт: bytearray(b'jello')

Почему это важно? Практические последствия:

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

    def modify_list(lst):
        lst.append('modified')
    
    original = [1, 2]
    modify_list(original)
    print(original)  # Вывод: [1, 2, 'modified'] !
  • Ключи словаря: Только неизменяемые типы (строки, числа, кортежи) могут быть ключами словаря. Список или множество — не могут.

    valid_key = (1, 2)  # Кортеж (неизменяемый) — можно
    # invalid_key = [1, 2]  # Список (изменяемый) — вызовет TypeError
  • Безопасность в многопоточности: Работа с изменяемыми объектами требует синхронизации (например, через threading.Lock).

Общее правило: Если тип данных позволяет изменить свое содержимое "на месте" (in-place) с помощью методов вроде .append(), .add(), [key] = value или оператора индексации [index] = value, то он изменяемый.