Когда 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 начнет делать ее отдельные копии.


person krzyhub    schedule 16.05.2012    source источник
comment
Вы спрашиваете, какой длины должна быть строка, прежде чем python начнет делать ее отдельные копии?   -  person Matt Fenwick    schedule 16.05.2012
comment
Это полностью зависит от реализации и может быть изменено в следующей версии Python без предупреждения. Почему ты хочешь знать?   -  person Mark Ransom    schedule 16.05.2012
comment
Да, я спрашиваю, какой длины должна быть строка, прежде чем python начнет делать ее отдельные копии.   -  person krzyhub    schedule 16.05.2012
comment
@Cris: Чего ты пытаешься достичь? Поведение определяется реализацией, и на него нельзя полагаться. Почему бы просто не проверить на равенство?   -  person Daenyth    schedule 16.05.2012
comment
Я просто хочу знать, чтобы знать. Не знаю, что это не важно и очень гибко.   -  person krzyhub    schedule 16.05.2012
comment
если вы просто хотите знать, почему бы вам не протестировать его на реализации, которую вы используете?   -  person Karoly Horvath    schedule 16.05.2012
comment
если я буду только тестировать, я никогда не узнаю, что это зависит от реализации   -  person krzyhub    schedule 16.05.2012
comment
Обратите внимание, что вы можете получить другой результат, если поместите свои примеры операторов в скрипт, вместо того, чтобы пробовать их в интерактивном режиме.   -  person Janne Karila    schedule 16.05.2012


Ответы (3)


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

person MattH    schedule 16.05.2012
comment
... зависит от реализации. Это тоже ответ. Спасибо. - person krzyhub; 16.05.2012
comment
@Cris В качестве конкретного примера: версия Python для ideone, похоже, интерпретирует ваши длинные строки, а также 1000-символьное-eval -сконструированные строки. - person trutheality; 16.05.2012
comment
Это дает мне немного больше знаний и больше вопросов, но все в порядке. - person krzyhub; 16.05.2012
comment
Так неужели пользователи никогда не смогут протестировать s1 is s2? - person smci; 14.09.2018

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

>>> a = intern('12345678012345678901234567890qazwsxedcrfvtgbyhnujmikolp')
>>> b = intern('12345678012345678901234567890qazwsxedcrfvtgbyhnujmikolp')
>>> a is b
True
person Spaceghost    schedule 16.05.2012
comment
По какой-то странной причине, полезно знать. - person krzyhub; 16.05.2012
comment
Кроме того, стажер перемещается в модуль sys в python 3000 вместе с идентификатором. Также полезно знать. - person Spaceghost; 16.05.2012
comment
По некоторым причинам наиболее. Не могли бы вы сказать, что intern() это только игрушка Python 3000? - person krzyhub; 16.05.2012
comment
@Cris intern() работает на Python по крайней мере с версии 1.5. - person trutheality; 16.05.2012
comment
intern находится в корневом пространстве имен. - person Spaceghost; 16.05.2012
comment
Он встроенный, вам не нужно ничего импортировать. - person Karl Knechtel; 16.05.2012

Вот фрагмент комментария об интернированной строке из исходного файла 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 содержат ;, поэтому они не будут интернированы.

person morsel.wang    schedule 09.05.2014