Вопрос проверяет понимание механизма интернирования строк и целых чисел в Python, который используется для оптимизации памяти и ускорения сравнений.
Интернирование (interning) — это техника оптимизации, применяемая в Python для некоторых неизменяемых типов данных, в первую очередь для строк и целых чисел. Её цель — уменьшить потребление памяти и ускорить сравнение объектов за счёт повторного использования уже созданных экземпляров.
Python поддерживает пул интернированных объектов. Когда вы создаёте строку или целое число, которое подпадает под критерии интернирования, интерпретатор сначала проверяет, нет ли уже такого объекта в пуле. Если есть — возвращается ссылка на существующий объект, а новый не создаётся. Это можно проверить с помощью оператора is и функции id().
# Пример с целыми числами
a = 100
b = 100
print(a is b) # True, потому что 100 интернируется
c = 300
d = 300
print(c is d) # Может быть True или False в зависимости от реализации
# Пример со строками
s1 = 'hello'
s2 = 'hello'
print(s1 is s2) # True для коротких строк
s3 = 'hello world!'
s4 = 'hello world!'
print(s3 is s4) # Может быть False для длинных строк
# Явное интернирование строк
import sys
s5 = sys.intern('a long string that might not be interned automatically')
s6 = sys.intern('a long string that might not be interned automatically')
print(s5 is s6) # True после явного интернированияИнтернирование особенно полезно в ситуациях, когда в программе много повторяющихся строковых значений, например, при обработке текста, парсинге XML/HTML (теги, атрибуты), работе с идентификаторами в базах данных или ключами в словарях. Явное интернирование через sys.intern() может значительно сократить потребление памяти в таких случаях.
Вывод: Механизм интернирования стоит применять сознательно для оптимизации памяти при работе с большим количеством повторяющихся неизменяемых значений, особенно строк-идентификаторов, где важна скорость сравнения.