Строки 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. Существуют некоторые исключения, которые четко определены в статье.