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