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

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

Ответ

Неизменяемые (immutable) типы в Python — это типы, объекты которых нельзя изменить после создания. Любая операция, которая кажется изменяющей объект, на самом деле создает новый объект.

Основные встроенные immutable-типы:

  1. int — целые числа.
  2. float — числа с плавающей точкой.
  3. bool — логические значения (True, False).
  4. str — строки.
  5. tuple — кортежи.
  6. frozenset — неизменяемое множество.
  7. bytes — неизменяемая последовательность байтов.
  8. range — диапазон.
  9. NoneType (тип объекта None).

Почему это важно?

  • Безопасность: Immutable-объекты потокобезопасны.
  • Хешируемость: Их можно использовать как ключи словаря (dict) или элементы множества (set).
  • Предсказуемость: Передача в функцию не приводит к неожиданным изменениям исходного объекта.

Примеры и демонстрация:

# 1. Строки (str) — immutable
my_string = "hello"
print(id(my_string))  # id: 140245... (адрес в памяти)
my_string += " world"  # Конкатенация создает НОВЫЙ объект
print(id(my_string))  # id: 140245... (уже другой адрес!)
# my_string[0] = 'H'  # TypeError: 'str' object does not support item assignment

# 2. Кортежи (tuple) — immutable
my_tuple = (1, 2, [3, 4])
# my_tuple[0] = 10  # TypeError: 'tuple' object does not support item assignment
# Однако, если элемент сам является изменяемым (как список [3,4]), его содержимое можно менять!
my_tuple[2].append(5)  # Это сработает: кортеж хранит ссылку на список, а не сам список.
print(my_tuple)  # (1, 2, [3, 4, 5])

# 3. Использование как ключ словаря (требуется хешируемость)
valid_dict = {(1, 2): "value"}  # Кортеж — immutable, можно как ключ.
# invalid_dict = {[1, 2]: "value"}  # TypeError: unhashable type: 'list' (list — mutable)