Сравните две одинаковые строки, но получите разные результаты в IDLE - PullRequest
0 голосов
/ 20 февраля 2012

Я использую Python 2.7.2 со встроенным IDLE на Windows 7 x64, и обнаружил очень странную вещь:

>>> a = "aaa"
>>> b = "aaa"
>>> print a is b
True
>>> print a == b
True
>>> print "%s , %s" % (id(a), id(b))
43872224 , 43872224
>>> 

Это нормально, но, если строка содержит пробел:

>>> x = "x x"
>>> y = "x x"
>>> print x is y
False
>>> print x == y
True
>>> print "%s , %s" % (id(x), id(y))
43872008 , 43872128
>>> 

Обратите внимание x is y это False! И у них разные идентификаторы!

Я пробовал этот код в PyCharm, все возвращает True, поэтому я думаю, что это может быть ошибка IDLE.

Не правда ли? Или я что-то пропустил?

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Оператор Python is фактически проверяет, являются ли передаваемые параметры одним и тем же объектом, поэтому в этом случае, хотя они имеют одинаковое значение, они не являются одним и тем же объектом.

Это на самом деле обсуждалось здесь ранее: с гораздо более подробной информацией также стоит проверить.

2 голосов
/ 20 февраля 2012

Все это означает, что IDLE реализует политики интернирования строк *1001*, отличные от значений по умолчанию интерпретатора или PyCharm.Если строки интернированы, то две одинаковые строки будут одинаковыми строкой, то есть a == b будет означать a is b.Если это не так, то вы можете получить первое без второго, как и в случае с другими объектами Python:

>>> a = ['']
>>> b = ['']
>>> a is b
False
>>> a == b
True

РЕДАКТИРОВАТЬ: насколько я могу судить по экспериментам, интерактивный интерпретатор не интернирует эти строки,Тем не менее, запуск его в виде сценария .py делает их интернированием.Скорее всего, Python рассматривает строки, считанные из STDIN или файла на диске, в отличие от строковых литералов в файле исходного кода.

...