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

Расскажи факт про Python, который мало кто знает

2.0 Middle🔥 131 комментариев
#Python Core

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

Интернирование строк и целых чисел в Python

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

Как это работает

Для строк и небольших целых чисел Python кэширует объекты. Это значит, что две переменные могут указывать на один и тот же объект в памяти:

a = 256
b = 256
print(a is b)  # True — одинаковый объект в памяти

c = 257
d = 257
print(c is d)  # False — разные объекты

Почему именно 256? Потому что Python кэширует целые числа от -5 до 256 (эти числа используются часто, поэтому их интернирование имеет смысл).

Со строками ситуация интереснее:

s1 = "hello"
s2 = "hello"
print(s1 is s2)  # True — интернированы

s3 = "hello world"
s4 = "hello world"
print(s3 is s4)  # False — не интернированы

Строки интернируются только если они являются валидными идентификаторами (буквы, цифры, подчёркивания) или если Python сам решит их интернировать во время парсинга кода.

Практическое значение

Это не просто академический интерес — это критически важно для понимания поведения операций сравнения:

# Неправильное сравнение
if a is b:  # Опасно! Проверяет идентичность, не равенство
    pass

# Правильное сравнение
if a == b:  # Правильно! Проверяет значение
    pass

Зачем Python это делает

Экономия памяти — вместо того чтобы создавать новый объект для каждого целого числа от -5 до 256, Python создаёт его один раз и переиспользует. В большом приложении это может сэкономить мегабайты памяти.

Производительность — сравнение идентичности (is) быстрее, чем сравнение значений (==), потому что нужно только сравнить адреса памяти.

Проверка интернирования

Чтобы увидеть идентификатор объекта:

print(id(256))  # Одинаковый для всех переменных, равных 256
print(id(257))  # Разный, потому что не интернируется

# Для строк
s1 = "test"
s2 = "test"
print(id(s1) == id(s2))  # Часто True (но не гарантировано)

Это очень полезный факт при собеседовании, потому что показывает понимание внутреннего устройства Python и правильное использование операторов сравнения.