Chociaż to pytanie nie ma żadnego rzeczywistego zastosowania w praktyce, jestem ciekawy, jak Python dokonuje internowania ciągów. Zauważyłem, co następuje.
>>> "string" is "string"
True
To jest tak, jak się spodziewałem.
Ty też możesz to zrobić.
>>> "strin"+"g" is "string"
True
I to całkiem sprytne!
Ale nie możesz tego zrobić.
>>> s1 = "strin"
>>> s2 = "string"
>>> s1+"g" is s2
False
Dlaczego Python miałby nie ocenić s1+"g"
i zdać sobie sprawę, że to to samo, co s2
i skierować go pod ten sam adres? Co właściwie dzieje się w tym ostatnim bloku, że wraca False
?
"string1" + "s2"
,10 + 3*20
etc.) w czasie kompilacji, ale ograniczenia wynikające sekwencje do zaledwie 20 elementów (w celu zapobieżenia[None] * 10**1000
z nadmiernie rozszerza swoją kodu bajtowego). To właśnie ta optymalizacja zapadła"strin" + "g"
się"string"
; wynik jest krótszy niż 20 znaków.