сравнение двух строк с 'is' - выполняется не так, как ожидалось

StackOverflow https://stackoverflow.com/questions/1216259

Вопрос

Я пытаюсь сравнить две строки с является.Одна строка возвращается функцией, а другая просто объявляется при сравнении. является тесты на идентификацию объекта, но в соответствии с эта страница, он также работает с двумя идентичными строками из-за оптимизации памяти Python.Но следующее не работает:

def uSplit(ustring):
        #return user minus host
        return ustring.split('!',1)[0]

user = uSplit('theuser!host')
print type(user)
print user
if user is 'theuser':
    print 'ok'
else:
    print 'failed'

user = 'theuser'

if user is 'theuser':
    print 'ok'

Результат:

type 'str'
theuser
failed
ok

Я предполагаю, что причина этого в том, что строка, возвращаемая функцией, имеет другой "тип" string, чем строковый литерал.Можно ли как-нибудь получить функцию, возвращающую строковый литерал?Я знаю, что мог бы использовать ==, но мне просто любопытно.

Это было полезно?

Решение

На сайте, который вы цитируете, написано следующее:

Если два строковых литерала равны, значит, они были помещены в одну и ту же ячейку памяти.

Но

uSplit('theuser!host')

не является строковым литералом - это результат операции над литералом 'theuser!host'.

В любом случае, обычно вам не следует проверять равенство строк с помощью is, потому что эта оптимизация памяти в любом случае является всего лишь деталью реализации, на которую вам не следует полагаться.


Кроме того, Вы должны использовать is для таких вещей, как is None.Используйте его для проверки, являются ли два объекта - классов, которые вы разработали, - одним и тем же экземпляром.Вы не можете легко использовать его для строк или чисел, потому что правила создания этих встроенных классов сложны.Некоторые строки интернированы.Некоторые номера, аналогичным образом, интернированы.

Другие советы

На той странице, которую вы цитировали, написано " Если два строковых литерала равны, они помещаются в одну и ту же область памяти " (акцент мой). Python интернирует буквальные строки, но строки, которые возвращаются из некоторой произвольной функции, являются отдельными объектами. Оператор is можно рассматривать как сравнение указателей, поэтому два разных объекта не будут сравниваться как идентичные (даже если они содержат одинаковые символы, т. Е. Они равны).

То, с чем вы столкнулись, это тот факт, что Python не всегда объединяет все свои строки. Более подробно здесь:

http://mail.python.org/pipermail/tutor /2009-July/070157.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top