Строка — это изменяемый или неизменяемый тип данных?

«Строка — это изменяемый или неизменяемый тип данных?» — вопрос из категории Python, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Python строка (str) является неизменяемым (immutable) типом данных. Это фундаментальное свойство языка.

Что это значит на практике для тестирования: Любая операция, которая выглядит как изменение строки (конкатенация, replace(), upper()), на самом деле создает и возвращает новый строковый объект. Исходная строка остается неизменной.

# Исходная строка не меняется
original = "test_result_42.json"
new = original.replace("42", "100")

print(original)  # Вывод: 'test_result_42.json' (осталась прежней)
print(new)       # Вывод: 'test_result_100.json' (новый объект)
print(id(original) == id(new))  # Вывод: False (это разные объекты в памяти)

# Попытка изменить строку по индексу вызовет ошибку
original[0] = 'T'  # TypeError: 'str' object does not support item assignment

Почему это важно в контексте QA и автоматизации:

  1. Безопасность и предсказуемость: Неизменяемость гарантирует, что строки, переданные в функции или хранящиеся в структурах данных (например, как ключи словаря для тестовых конфигов), не будут неожиданно изменены где-то еще в коде.
  2. Потокобезопасность: Неизменяемые объекты по своей природе потокобезопасны, что упрощает написание параллельных тестов.
  3. Кэширование: Python может кэшировать строки (интернирование), что оптимизирует память, особенно при работе с множеством одинаковых строковых литералов (например, селекторами в UI-тестах).
  4. Написание чистых функций: При написании вспомогательных функций для обработки тестовых данных (логов, имен файлов, ответов API) проще рассуждать об их работе, зная, что входные строки не изменятся.