← Назад к вопросам

Какие знаешь неизменяемые типы данных в Python?

1.3 Junior🔥 61 комментариев
#Другое

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Неизменяемые (immutable) типы данных в Python

В Python неизменяемые типы данных — это типы, объекты которых не могут быть изменены после создания. При попытке модификации создается новый объект. Вот основные из них:

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

1. Числовые типы

  • int (целые числа)
  • float (числа с плавающей точкой)
  • complex (комплексные числа)
  • bool (логический тип, подкласс int)

2. Последовательности

  • str (строки)
  • tuple (кортежи)
  • range (диапазоны)
  • bytes (байтовые строки)
  • frozenset (неизменяемое множество)

3. Другие

  • NoneType (тип объекта None)
  • namedtuple (именованный кортеж из модуля collections)
  • datetime (объекты даты-времени, так как они представляют конкретные моменты)

Практическая демонстрация неизменяемости

# Пример с целыми числами (int)
x = 10
print(id(x))  # id объекта до изменения
x += 5
print(id(x))  # id изменился - создан новый объект

# Пример со строками (str)
text = "Hello"
print(id(text))
text += " World"
print(id(text))  # Создана новая строка

# Пример с кортежами (tuple)
my_tuple = (1, 2, 3)
print(id(my_tuple))
# my_tuple[0] = 5  # Вызовет TypeError: 'tuple' object does not support item assignment

# Создание нового кортежа на основе старого
new_tuple = my_tuple + (4,)
print(id(new_tuple))  # Совершенно новый объект

Почему неизменяемость важна для QA Engineer

  1. Безопасность данных: Неизменяемые объекты можно безопасно передавать между функциями и потоками без риска нежелательного изменения.

  2. Кэширование и хэширование: Неизменяемые объекты могут использоваться как ключи словарей и элементы множеств, так как их хэш-значение постоянно.

# Только неизменяемые типы могут быть ключами словаря
valid_dict = {
    "string_key": "value",  # str - OK
    123: "value",           # int - OK
    (1, 2): "value",        # tuple - OK
    # [1, 2]: "value"       # list - вызовет TypeError (изменяемый тип)
}

# frozenset как ключ словаря
fs = frozenset([1, 2, 3])
dict_with_frozenset = {fs: "value"}
  1. Предсказуемость: Код с неизменяемыми структурами проще отлаживать и тестировать, так как состояние объектов не меняется неожиданно.

  2. Оптимизация: Python может кэшировать и повторно использовать неизменяемые объекты (например, маленькие целые числа и короткие строки).

Особые случаи и нюансы

# Кортежи неизменяемы, но могут содержать изменяемые элементы
mixed_tuple = ([1, 2], 3)
print(mixed_tuple)  # ([1, 2], 3)

# Мы не можем изменить сам кортеж, но можем изменить список внутри него
mixed_tuple[0].append(3)
print(mixed_tuple)  # ([1, 2, 3], 3)

# Замороженные множества (frozenset)
fs1 = frozenset([1, 2, 3])
fs2 = frozenset([3, 4, 5])
union_fs = fs1.union(fs2)  # Создает НОВЫЙ frozenset

Применение в тестировании

При написании автотестов я часто использую неизменяемые типы для:

  • Тестовых данных, которые не должны меняться в процессе выполнения тестов
  • Конфигурационных параметров, которые должны оставаться постоянными
  • Ключей для параметризованных тестов
  • Фикстур, которые используются в нескольких тестах без модификации

Проверка неизменяемости

def check_immutability(obj, obj_type):
    try:
        # Пытаемся изменить объект
        if hasattr(obj, '__setitem__'):
            obj[0] = 'modified'
        return f"{obj_type} - неизменяемый"
    except (TypeError, AttributeError):
        return f"{obj_type} - неизменяемый"
    else:
        return f"{obj_type} - изменяемый"

# Тестируем разные типы
print(check_immutability("test", "str"))
print(check_immutability((1, 2), "tuple"))
print(check_immutability([1, 2], "list"))
print(check_immutability(frozenset([1, 2]), "frozenset"))

Понимание неизменяемых типов критически важно для эффективного тестирования Python-приложений, так как помогает предвидеть поведение кода, избегать побочных эффектов и создавать более надежные тесты.