Хотя этот вопрос не имеет практического применения, мне любопытно, как Python выполняет интернирование строк. Я заметил следующее.
>>> "string" is "string"
True
Это как я и ожидал.
Вы тоже можете это сделать.
>>> "strin"+"g" is "string"
True
И это очень умно!
Но ты не можешь этого сделать.
>>> s1 = "strin"
>>> s2 = "string"
>>> s1+"g" is s2
False
Почему бы Python не оценить s1+"g"
и не понять, что это то же самое, s2
и не указать на тот же адрес? Что на самом деле происходит в этом последнем блоке, чтобы он вернулся False
?
"string1" + "s2"
,10 + 3*20
и т. Д.) Во время компиляции, но ограничивает результирующие последовательности всего 20 элементами (чтобы предотвратить[None] * 10**1000
чрезмерное расширение вашего байт-кода). Именно эта оптимизация обрушилась"strin" + "g"
на"string"
; результат короче 20 символов.