Хотя этот вопрос не имеет практического применения, мне любопытно, как 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 символов.