Python: Почему делает (“привет” “привет”), оценивают как Верный? [дубликат]

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

Мы вывели слой и создали тот сами, который всегда закрывает и располагает соединения. С тех пор мы больше не получаем ошибку.

56
задан Martijn Pieters 26 April 2018 в 08:00
поделиться

7 ответов

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

Еще одна полезность: «ад» + «o» - «привет» = => True

87
ответ дан 26 November 2019 в 17:04
поделиться

Значит, для каждой строки Python есть одно и только одно место?

Нет, только те, которые интерпретатор решил оптимизировать, и это решение основано на политике, которая не t часть спецификации языка и может измениться в разных версиях 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' is 'string': даже просто глядя на реализацию C, это небезопасно.

60
ответ дан 26 November 2019 в 17:04
поделиться

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

 Memory        Code
-------
|          myLine = "hello"
|        /
|hello  <
|        \
|          myLine = "hello"
-------
13
ответ дан 26 November 2019 в 17:04
поделиться

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

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

6
ответ дан 26 November 2019 в 17:04
поделиться

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

2
ответ дан 26 November 2019 в 17:04
поделиться

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

0
ответ дан 26 November 2019 в 17:04
поделиться

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

1
ответ дан 26 November 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: