Python интернирует все целые числа от -5
до 256
, а также строковые литералы.Это означает, что всякий раз, когда вы получаете такое значение, Python знает, что у него есть его копия в памяти, и возвращает один и тот же объект.
Хотя, способ, которым это происходит, различен для обоих типов.
Дляцелые числа, эти значения всегда интернированы, что позволяет процессу быть динамическим.
С другой стороны, интернирование строк происходит при компиляции и, таким образом, специфично для строковых литералов.
Мы можем провести некоторый экспериментс is
, что эквивалентно сравнению id
.
x = 1 + 1
y = 3 - 1
x is y # True
x = 'b'
y = 'b'
x is y # True
x = 257
y = 257
x is y # False
x = 'ab'.replace('a', '')
y = 'b'
x is y # False
Хотя это не относится к объектам других типов, таких как list
, а именно потому, что они изменчивы, так что вы абсолютноне хотел бы, чтобы возвращался тот же объект.
[] is [] # False
Хотя суть в том, что это реализация оптимизации, и вы не должны полагаться на нее в своем коде.В общем, предположим, что разные выражения возвращают разные объекты, поскольку приведенные выше являются исключениями.