Когда python выбирает старую строку

>>> s1 = "spam"
>>> s2 = "spam"
>>> s1 is s2
True
>>> q = 'asdalksdjfla;ksdjf;laksdjfals;kdfjasl;fjasdf'
>>> r = 'asdalksdjfla;ksdjf;laksdjfals;kdfjasl;fjasdf'
>>> q is r
False

Сколько символов должно быть s1 is s2 дать False? Где предел? Я спрашиваю, как долго должна быть строка, прежде чем python начнет делать отдельные копии.

Ответ 1

Интерпретация строк является специфичной для реализации, и на нее нельзя положиться, используйте тестирование равенства, если вы хотите проверить, что две строки идентичны.

Ответ 2

Если вы хотите, по какой-то причудливой причине, заставить сравнение быть истинным, используйте функцию intern:

>>> a = intern('12345678012345678901234567890qazwsxedcrfvtgbyhnujmikolp')
>>> b = intern('12345678012345678901234567890qazwsxedcrfvtgbyhnujmikolp')
>>> a is b
True

Ответ 3

Вот фрагмент комментария о интернированной строке из исходного файла CPython 2.5.0 (stringobject.h)

/* ... ... This is generally restricted to strings that **"look like" Python identifiers**, although the intern() builtin can be used to force interning of any string ... ... */

Соответственно, строки содержат только символы подчеркивания, цифры или алфавиты будут интернированы. В вашем примере q и `` r содержат ;, поэтому они не будут интернированы.