Python: Почему ( "привет" "привет" ) оценивается как "Истина"?

Почему "hello" is "hello" создает True в Python?

Я прочитал следующее здесь:

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

Итак, для каждой строки Python существует одно и только одно место в памяти? Звучит довольно странно. Что здесь происходит?

Ответ 1

Python (например, Java, C, С++,.NET) использует пул строк/интернирование. Интерпретатор понимает, что "привет" совпадает с "привет", поэтому он оптимизирует и использует одно и то же местоположение в памяти.

Еще один плюс: "hell" + "o" is "hello" == > True

Ответ 2

Итак, для каждой строки Python существует одно и только одно место в памяти?

Нет, только те, которые интерпретатор решил оптимизировать, это решение, основанное на политике, которая не является частью спецификации языка и которая может изменяться в разных версиях CPython.

например. на моей установке (2.6.2 Linux):

>>> 'X'*10 is 'X'*10
True
>>> 'X'*30 is 'X'*30
False

аналогично для ints:

>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False

Поэтому не полагайтесь на строку "string": "string": даже просто глядя на реализацию C, она небезопасна.

Ответ 3

Литеральные строки, вероятно, сгруппированы на основе их хэша или чего-то подобного. Две одинаковые буквальные строки будут сохранены в одной и той же памяти, и любые ссылки ссылаются на них.

 Memory        Code
-------
|          myLine = "hello"
|        /
|hello  <
|        \
|          myLine = "hello"
-------

Ответ 4

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

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

Ответ 5

Интерпретатор/компилятор Python анализирует строковые литералы, т.е. цитируемый список символов. Когда он это сделает, он может обнаружить "я видел эту строку раньше" и использовать то же представление, что и в прошлый раз. Он может это сделать, поскольку он знает, что строки, определенные таким образом, не могут быть изменены.

Ответ 6

Почему это странно. Если строка является неизменной, имеет смысл хранить ее только один раз. У .NET такое же поведение.

Ответ 7

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