Строки Python intern?
В Java явно объявленные строки прерваны JVM, так что последующие объявления одной и той же строки приводят к двум указателям к одному экземпляру String, а не к двум отдельным (но идентичным) строкам.
Например:
public String baz() {
String a = "astring";
return a;
}
public String bar() {
String b = "astring"
return b;
}
public void main() {
String a = baz()
String b = bar()
assert(a == b) // passes
}
Мой вопрос в том, что CPython (или любая другая среда исполнения Python) делает то же самое для строк? Например, если у меня есть класс:
class example():
def __init__():
self._inst = 'instance'
И создайте 10 экземпляров этого класса, будет ли каждый из них иметь переменную экземпляра, относящуюся к той же строке в памяти, или я получаю 10 отдельных строк?
Ответы
Ответ 1
Это называется интернированием, и да, Python делает это в некоторой степени для более коротких строк, создаваемых как строковые литералы. Подробнее читайте в об изменении идентификатора неизменной строки.
Стажировка зависит от времени выполнения, для него нет стандарта. Стажировка - это всегда компромисс между использованием памяти и стоимостью проверки, если вы создаете одну и ту же строку. Существует функция sys.intern()
, чтобы вызвать проблему, если вы так склонны, которая документирует некоторые из стажировок Python для вас автоматически:
Обычно имена, используемые в программах Python, автоматически интернируются, а словари, используемые для хранения атрибутов модуля, класса или экземпляра, имеют интернированные ключи.
Обратите внимание, что Python 2 функция intern()
была встроенной, импорт не требуется.
Ответ 2
Достаточно простой способ сказать, используя id()
. Однако, как отмечает @MartijnPieters, это зависит от времени выполнения.
class example():
def __init__(self):
self._inst = 'instance'
for i in xrange(10):
print id(example()._inst)
Ответ 3
- Вся длина 0 и длина 1 строки интернированы.
- Строки интернированы во время компиляции ('wtf' будет интернирован, но ''.join(['w', 't', 'f'] не будет интернирован)
- Строки, которые не состоят из букв ASCII, цифр или символов подчеркивания, не интернированы. Это объясняет, почему "wtf!" не был интернирован из-за!.
https://www.codementor.io/satwikkansal/do-you-really-think-you-know-strings-in-python-fnxh8mtha
В приведенной выше статье объясняется интернирование строк в python. Существуют некоторые исключения, которые четко определены в статье.