сравнивая две строки с 'is' - не работает должным образом - PullRequest
1 голос
/ 01 августа 2009

Я пытаюсь сравнить две строки с , равным . Одна строка возвращается функцией, а другая только что объявляется в сравнении. - это тесты на идентичность объекта, но согласно этой странице он также работает с двумя одинаковыми строками из-за оптимизации памяти 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

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

Ответы [ 3 ]

3 голосов
/ 01 августа 2009

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

2 голосов
/ 01 августа 2009

Сайт, который вы цитируете, говорит об этом:

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

Но

uSplit('theuser!host')

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

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


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

0 голосов
/ 01 августа 2009

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

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

...