Хоча це питання практично не застосовується на практиці, мені цікаво, як 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 символів.