Код, который вы разместили, создает новые строки в качестве промежуточных объектов.Эти созданные строки в конечном итоге имеют то же содержимое, что и ваши оригиналы.В промежуточный период времени они не полностью совпадают с оригиналом и должны храниться по отдельному адресу.
>>> id('cat')
5181152
Как уже ответили другие, выполняя эти инструкции, вы заставляете виртуальную машину Python создаватьстроковый объект, содержащий строку «кошка».Этот строковый объект кэшируется и находится по адресу 5181152.
>>> a = 'cat'
>>> id(a)
5181152
Опять же, для ссылки на этот кешированный строковый объект на 5181152 был назначен символ "cat".
>>> a = a[0:2]
>>> id(a)
27731511
На данный момент в моей модифицированной версии вашей программы вы создали два небольших строковых объекта: 'cat'
и 'ca'
.'cat'
все еще существует в кэше.Строка, на которую ссылается a
, представляет собой другой и, вероятно, новый строковый объект, содержащий символы 'ca'
.
>>> a = a + 't'
>>> id(a)
39964224
Теперь вы создали еще один новый строковый объект.Этот объект является конкатенацией строки 'ca'
по адресу 27731511 и строки 't'
.Эта конкатенация соответствует ранее кэшированной строке 'cat'
.Python не обнаруживает этот случай автоматически.Как указано выше, вы можете принудительно выполнить поиск с помощью метода intern()
.
Надеемся, что это объяснение освещает шаги, с помощью которых изменился адрес a
.
Ваш код не включалпромежуточному состоянию с a
присваивается строка 'ca'
.Ответ остается в силе, потому что интерпретатор Python генерирует новый строковый объект для хранения промежуточного результата a[0:2]
, независимо от того, назначаете ли вы этот промежуточный результат переменной или нет.