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