Сколько объектов будет в памяти, если число 10 присвоено 27 переменным в Python?
Что проверяют
Понимаете ли вы разницу между именем и объектом. В Python присваивание не копирует значение, оно связывает имя со ссылкой, и вопрос проверяет именно это, а заодно знание про кэш малых целых и про то, что это деталь реализации.
Как отвечать
Объект будет один, ссылок на него двадцать семь. Целые числа неизменяемы, а CPython при старте создаёт готовые объекты для небольших чисел, примерно от минус пяти до двухсот пятидесяти шести, и выдаёт их повторно вместо создания новых.
a = 10
b = 10
a is b # True, один и тот же объект
id(a) == id(b) # TrueПолезно уточнить две вещи. Первая: один объект не означает, что двадцать семь имён бесплатны. Каждое имя это запись в словаре модуля или слот в кадре функции, то есть указатель, и счётчик ссылок объекта растёт с каждым связыванием. Вторая: кэш малых целых это особенность конкретной реализации, а не гарантия языка, и полагаться на него в логике нельзя.
Если спросят про большие числа, ответ честный: гарантии нет. Внутри одного блока кода компилятор складывает одинаковые константы в один объект, поэтому в теле функции два раза записанная тысяча может оказаться тем же объектом, а введённая двумя строками в интерактивной сессии уже нет.
Где спотыкаются
Отвечают, что объектов двадцать семь, по одному на переменную. Это перенос модели из языков, где переменная это ячейка со значением, а в Python переменная это ярлык на объект.
Обобщают кэш на все числа и начинают сравнивать значения через is. На малых числах такой код случайно работает, на больших ломается, поэтому значения сравнивают через ==, а is оставляют для None и других одиночек.
Называют это интернированием. Термин закреплён за строками, у чисел это преаллоцированный кэш. Рядом стоит сказать про изменяемые объекты: два одинаковых списка это всегда два разных объекта, и повторного использования там нет и быть не может.