Python имеет пул всех строк и является ими (строки) одиночные элементы там?
Более точный, в следующем коде одна или две строки были созданы в памяти:
a = str(num)
b = str(num)
?
Строки неизменяемы в 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
В общем, строки не интернируются в 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 и даже между версиями одной и той же реализации.
Строки вообще не интернируются. В вашем примере будут созданы две строки (за исключением значений от 0 до 9). Чтобы проверить это, мы можем использовать оператор is
, чтобы увидеть, являются ли две строки одним и тем же объектом:
>>> str(1056) is str(1056)
False