Внимание! Этот ответ касается деталей реализации конкретного интерпретатора Python. сравнение строк с is
==плохой идеей.
Ну, по крайней мере, для cpython3.4/2.7.3 ответ "нет, это не пробел". Не только пробел:
Два строковых литерала будут совместно использовать память, если они либо буквенно-цифровые, либо находятся в одном и том же блоке (файле, функции, классе или одной команде интерпретатора).
Выражение, результатом которого является строка, приведет к созданию объекта, идентичного объекту, созданному с использованием строкового литерала, тогда и только тогда, когда он создан с использованием констант и бинарных/унарных операторов, а результирующая строка короче 21 символа.
Отдельные символы уникальны.
Примеры
Буквенно-цифровые строковые литералы всегда совместно используют память:
>>> x='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> y='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> x is y
True
Строковые литералы, не являющиеся буквенно-цифровыми, совместно используют память тогда и только тогда, когда они совместно используют окружающий синтаксический блок:
(устный переводчик)
>>> x='`!@#$%^&*() \][=-. >:"?<a'; y='`!@#$%^&*() \][=-. >:"?<a';
>>> z='`!@#$%^&*() \][=-. >:"?<a';
>>> x is y
True
>>> x is z
False
(файл)
x='`!@#$%^&*() \][=-. >:"?<a';
y='`!@#$%^&*() \][=-. >:"?<a';
z=(lambda : '`!@#$%^&*() \][=-. >:"?<a')()
print(x is y)
print(x is z)
Выход: True
и False
Для простых бинарных операций компилятор выполняет очень простое распространение констант (см. peephole.c). ), но со строками это происходит только в том случае, если результирующая строка короче 21 символа. В этом случае действуют упомянутые ранее правила:
>>> 'a'*10+'a'*10 is 'a'*20
True
>>> 'a'*21 is 'a'*21
False
>>> 'aaaaaaaaaaaaaaaaaaaaa' is 'aaaaaaaa' + 'aaaaaaaaaaaaa'
False
>>> t=2; 'a'*t is 'aa'
False
>>> 'a'.__add__('a') is 'aa'
False
>>> x='a' ; x+='a'; x is 'aa'
False
Конечно, отдельные символы всегда разделяют память:
>>> chr(0x20) is ' '
True
person
Community
schedule
26.05.2013
==
для сравнения любого элемента на равенство, но, тем не менее, это интересный вопрос. - person jamylak   schedule 26.05.2013a is b
(обратите внимание, что строковая константа, назначеннаяb
, уже создана и повторно используется). Правило интернирования должно учитывать пробелы (или, возможно, длину) - person Ben Jackson   schedule 26.05.2013id('ab')
постоянно возвращает одно и то же значение в моей оболочке, аid('a ')
постоянно изменяется. Я до сих пор понятия не имею, почему буквы ведут себя иначе, но наблюдать за этим интересно. Возможно, Python делает какую-то оптимизацию, предполагая, что строки часто содержат буквы? Я не думаю, что это имело бы большой смысл, но трудно объяснить такое поведение. Это интересный вопрос. - person Nolen Royalty   schedule 26.05.2013is
, возможно, этот вопрос было бы полезно, если бы оно содержало полезный ответ. - person glglgl   schedule 26.05.2013