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

В чем разница между изменяемыми и неизменяемыми типами данных в Python?

1.6 Junior🔥 181 комментариев
#Python

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

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

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

Разница между изменяемыми и неизменяемыми типами данных в Python

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

Определение изменяемых и неизменяемых типов

Неизменяемый тип — это объект, чье состояние (значение) нельзя изменить после создания. Любая операция, которая якобы "изменяет" такой объект, фактически создает новый объект с новым значением.

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

Ключевые различия в поведении

1. Возможность модификации

Неизменяемый объект создается один раз, и его значение зафиксировано.

# Пример с неизменяемой строкой (str)
my_string = "Hello"
new_string = my_string.replace("H", "J")  # Операция не изменяет исходный объект
print(my_string)  # Вывод: "Hello"  (оригинал не изменен)
print(new_string) # Вывод: "Jello"  (создан новый объект)

# Пример с изменяемым списком (list)
my_list = [1, 2, 3]
my_list.append(4)  # Операция изменяет сам объект
print(my_list)     # Вывод: [1, 2, 3, 4]  (оригинал изменен)

2. Идентичность объектов (id())

Для неизменяемых объектов при "изменении" id() (адрес в памяти) становится другим. Для изменяемых — может остаться тем же.

x = 5  # int - неизменяемый
print(id(x))  # Адрес в памяти (например, 140722090123456)
x = x + 1
print(id(x))  # Новый адрес (например, 140722090123488) - Создан новый объект

y = [5]  # list - изменяемый
print(id(y))  # Адрес в памяти
y.append(6)
print(id(y))  # Адрес остается тем же - объект модифицирован

3. Поведение при передаче в функции

Неизменяемые объекты передаются по значению (фактически — по ссылке, но невозможность изменения защищает оригинал). Изменяемые объекты передаются по ссылке, что может приводить к неожиданным изменениям оригинала.

def modify_immutable(num):
    num += 10
    return num

def modify_mutable(lst):
    lst.append(100)

original_num = 5
modified_num = modify_immutable(original_num)
print(original_num)  # 5 (не изменился)
print(modified_num)  # 15 (новый объект)

original_list = [1, 2, 3]
modify_mutable(original_list)
print(original_list)  # [1, 2, 3, 100] (изменился!)

4. Использование в качестве ключей в словарях

Неизменяемые объекты могут быть ключами в словарях, так как их hash() (хеш-значение) постоянен. Изменяемые объекты не могут быть ключами, так как изменение их состояния повлияет на хеш.

# Работает: int (неизменяемый) как ключ
dict_with_int_key = {5: "value"}
# Не работает: list (изменяемый) как ключ
# dict_with_list_key = {[1, 2]: "value"}  # TypeError: unhashable type: 'list'

Список основных типов в Python по категориям

Неизменяемые типы:

  • int (целые числа)
  • float (числа с плавающей точкой)
  • bool (логические значения)
  • str (строки)
  • tuple (кортежи) – содержит ссылки, но сам кортеж как структура неизменяем
  • frozenset ("замороженное" множество)
  • bytes (байтовые последовательности)
  • None (специальный тип)

Изменяемые типы:

  • list (списки)
  • dict (словари)
  • set (множества)
  • bytearray (изменяемая байтовая последовательность)
  • Объекты пользовательских классов (обычно, если не специально ограничены)

Практическое значение для QA Automation Engineer

  1. Тестирование функций с побочными эффектами: При написании тестов для функций, принимающих изменяемые аргументы (например, списки), необходимо проверять, не изменились ли случайно исходные данные. Это критично для тестов на регрессию.

  2. Предотвращение ошибок в многопоточных/многопроцессных тестах: Использование неизменяемых объектов безопаснее в параллельных тестах, так как исключает проблемы гонки данных. Например, передача tuple вместо list в задачи для пула процессов.

  3. Сравнение объектов и assert-проверки: При сравнении (assert) объектов важно понимать, что два неизменяемых объекта с одинаковым значением могут считаться равными (==), но не обязательно одинаковыми (is). Для изменяемых объектов, даже если содержимое одинаково, is часто вернет False.

# Для QA-тестов
a = (1, 2)  # tuple - неизменяемый
b = (1, 2)
assert a == b  # True по значению
assert a is b  # Может быть False (разные объекты)

c = [1, 2]  # list - изменяемый
d = [1, 2]
assert c == d  # True по значению
assert c is d  # False (разные объекты в памяти)
  1. Эффективность и оптимизация: В тестах, работающих с большими объемами данных, знание этой разницы помогает выбрать оптимальные структуры данных для уменьшения нагрузки на память и время выполнения.

Таким образом, глубокое понимание изменяемости и неизменяемости типов данных в Python позволяет QA Automation Engineer создавать более надежные, эффективные и безопасные тестовые сценарии, предугадывать потенциальные источники ошибок и корректно использовать механизмы языка в автоматизированных проверках.

В чем разница между изменяемыми и неизменяемыми типами данных в Python? | PrepBro