То, что вы видите, это детали реализации (внутренняя оптимизация), вызывающие interning . Это методика (используемая реализациями ряда языков, включая Java и Lua), в которой псевдонимы или переменные используются для ссылки на экземпляры одного объекта, где это возможно или возможно.
Вы не должны зависеть от этого поведения. Это не является частью формальной спецификации языка, и нет никаких гарантий, что отдельные литеральные ссылки на строку или целое число будут интернированы или что данный набор операций (строковых или числовых), дающих данный объект, будет интернирован против идентичных в других отношениях объектов.
Я слышал, что реализация C Python включает в себя набор из первых сотен или около того целых чисел в виде статически создаваемых неизменяемых объектов. Я подозреваю, что другие библиотеки времени исполнения языка очень высокого уровня, вероятно, будут включать подобные оптимизации: первые сто целых чисел используются очень часто большинством нетривиальных фрагментов кода.
С точки зрения того, как такие вещи реализованы ... для строк и больших целых чисел было бы целесообразно, чтобы Python поддерживал их в качестве словарей. Таким образом, любое выражение, дающее целое число (и, возможно, даже число с плавающей запятой) и строки (по крайней мере, достаточно короткие строки), будет хэшировано, найдено в соответствующем (внутреннем) объектном словаре, добавлено при необходимости и затем возвращено как ссылки на результирующий объект.
Вы можете сделать свое собственное подобное интернирование любых видов пользовательских объектов, которые вам нравятся, обернув инстанцирование в ваших собственных вызовах в ваш собственный статический словарь класса.