Строки, объединенные в Python

Python имеет пул всех строк и является ими (строки) одиночные элементы там?

Более точный, в следующем коде одна или две строки были созданы в памяти:

a = str(num)
b = str(num) 

?

10
задан gruszczy 25 March 2010 в 23:46
поделиться

3 ответа

Строки неизменяемы в Python, поэтому реализация может решить, следует ли интернировать (это термин, часто связанный с C #, означающий, что некоторые строки хранятся в пуле) строки или нет.

В вашем примере вы динамически создаете строки. CPython не всегда изучает пул, чтобы определить, существует ли уже строка - это также не имеет смысла, потому что вам сначала нужно зарезервировать память, чтобы создать строку, а затем сравнить ее с содержимое пула (неэффективно для длинных строк).

Но для строк длиной 1 CPython смотрит в пул (см. "Stringobject.c"):

static PyStringObject *characters[UCHAR_MAX + 1];

...

PyObject *
PyString_FromStringAndSize(const char *str, Py_ssize_t size)
{

...

    if (size == 1 && str != NULL &&
    (op = characters[*str & UCHAR_MAX]) != NULL)
    {
        #ifdef COUNT_ALLOCS
            one_strings++;
        #endif

        Py_INCREF(op);
        return (PyObject *)op;
    }

...

Итак:

a = str(num)
b = str(num)
print a is b # <-- this will print False in most cases (but try str(1) is str(1))

Но при использовании константных строк непосредственно в вашем коде, CPython использует тот же экземпляр строки:

a = "text"
b = "text"
print a is b # <-- this will print True
19
ответ дан 3 December 2019 в 16:29
поделиться

В общем, строки не интернируются в Python, но иногда кажется:

>>> str(5) is str(5)
True
>>> str(50) is str(50)
False

Это не редкость в Python, где обычные объекты могут быть оптимизированы способами, в отличие от необычных:

>>> int(5+0) is int(5+0)
True
>>> int(50+0) is int(50+0)
True
>>> int(500+0) is int(500+0)
False

И имейте в виду, что все эти виды деталей будут различаться между реализациями Python и даже между версиями одной и той же реализации.

5
ответ дан 3 December 2019 в 16:29
поделиться

Строки вообще не интернируются. В вашем примере будут созданы две строки (за исключением значений от 0 до 9). Чтобы проверить это, мы можем использовать оператор is , чтобы увидеть, являются ли две строки одним и тем же объектом:

>>> str(1056) is str(1056)
False
1
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

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