Я встретился с этой проблемой также при использовании некоторого стороннего слоя данных в одном из моих приложений.NET. Проблема состояла в том, что слой не закрыл соединения правильно.
Мы вывели слой и создали тот сами, который всегда закрывает и располагает соединения. С тех пор мы больше не получаем ошибку.
Python (например, Java, C, C ++, .NET) использует пул / интернирование строк. Интерпретатор понимает, что «hello» - это то же самое, что «hello», поэтому он оптимизирует и использует то же место в памяти.
Еще одна полезность: «ад» + «o» - «привет»
= => True
Значит, для каждой строки 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, это небезопасно.
Литеральные строки, вероятно, группируются на основе их хэша или чего-то подобного. Две одинаковые литеральные строки будут храниться в одной и той же памяти, и обе ссылки относятся к ней.
Memory Code
-------
| myLine = "hello"
| /
|hello <
| \
| myLine = "hello"
-------
Оператор is
возвращает истину, если оба аргумента являются тот же объект. Ваш результат является следствием этого и процитированного бит.
В случае строковых литералов они интернированы, то есть сравниваются с известными строками. Если идентичная строка уже известна, литерал принимает это значение вместо альтернативного. Таким образом, они становятся одним и тем же объектом, и выражение истинно.
Интерпретатор / компилятор Python анализирует строковые литералы, то есть список символов в кавычках. Когда он это делает, он может определить «Я видел эту строку раньше» и использовать то же представление, что и в прошлый раз. Он может это сделать, поскольку знает, что определенные таким образом строки нельзя изменить.
Я думаю, что если какие-либо две переменные (а не только строки) содержат одно и то же значение, значение будет сохранено только один раз, а не дважды, и обе переменные будут указывать на одно и то же место. Это экономит память.
Почему странно. Если строка неизменяема, имеет смысл сохранить ее только один раз. .NET ведет себя так же.