В Python одинаковые строки символов гарантированно идентичны? - PullRequest
2 голосов
/ 23 июля 2010

Я где-то читал (я думаю, это тоже пост, и, вероятно, где-то еще), что Python автоматически ссылается на односимвольные строки, поэтому не только 'a' == 'a', но и 'a' is 'a'.

ОднакоЯ не могу вспомнить чтение, если это гарантированное поведение в Python, или это просто для конкретной реализации?

Бонусные баллы для официальных источников.

Ответы [ 2 ]

14 голосов
/ 23 июля 2010

Это зависит от реализации. Трудно сказать, потому что (как говорит ссылка ):

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

Переводчик очень хорош в том, что они идентичны, но это не всегда работает:

x = u'a'
y = u'abc'[:1]
print x == y, x is y

Запустите на CPython 2.6, это даст True False.

6 голосов
/ 23 июля 2010

Все это определяется реализацией.

В документации для интерна говорится: «Обычно имена, используемые в программах Python, автоматически интернируются, а словари, используемые для хранения атрибутов модуля, класса или экземпляра, имеют интернированные ключи."

Это означает, что все, что может быть именем и известно во время компиляции, вероятно (но не гарантировано) будет таким же, как и любые другие вхождения с тем же именем.

ДругоеСтроки не указаны для интернирования.Строки констант, появляющиеся в одном и том же модуле компиляции, складываются вместе (но это также просто детали реализации), поэтому вы получаете:

>>> a = '!'
>>> a is '!'
False
>>> a = 'a'
>>> a is 'a'
True
>>>

Строка, содержащая идентификатор, является интернированной, поэтому даже в разных компиляциях выта же строкаСтрока, которая не является идентификатором, используется совместно только в том же модуле компиляции:

>>> '!' is '!'
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...