Pergunta

Faz Python tem um conjunto de todas as seqüências de caracteres e são eles (cadeias de caracteres) singletons lá?

Mais precisamente, o código a seguir uma ou duas cordas foram criados na memória:

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

?

Foi útil?

Solução

Strings são imutáveis em Python, então a aplicação pode decidir se estagiário (que é um termo frequentemente associado com o C#, o que significa que algumas cadeias de caracteres são armazenados em uma piscina) cadeias de caracteres ou não.

No seu exemplo, você está criando seqüências de caracteres.CPython não nem sempre olhar para a piscina, para detectar se a seqüência de caracteres é que já está lá, ele também não faz sentido, porque primeiro você tem que reserva memória para criar a seqüência de caracteres e, em seguida, compará-lo à piscina conteúdo (ineficiente para cadeias longas).

Mas para cadeias de caracteres de comprimento, 1, CPython faz olhar para o exterior, piscina exterior (cf."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;
    }

...

Assim:

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

Mas quando usando constante seqüências de caracteres diretamente no seu código, CPython usa a mesma seqüência de caracteres exemplo:

a = "text"
b = "text"
print a is b # <-- this will print True

Outras dicas

Em geral, as cordas não estão internadas em Python, mas às vezes parecem ser:

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

Isso não é incomum em Python, onde objetos comuns podem ser otimizados de maneiras que os incomuns não são:

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

E lembre -se de que todos esses tipos de detalhes serão diferentes entre as implementações do Python e até entre as versões da mesma implementação.

As cordas não estão internadas em geral. No seu exemplo, duas seqüências serão criadas (com exceção dos valores entre 0 e 9). Para testar isso, podemos usar o is Operador para ver se as duas cordas são o mesmo objeto:

>>> str(1056) is str(1056)
False

A constante de piscina no python distingue a piscina inteira pequena e a grande piscina inteira, e a piscina inteira pequena está em [-5, 257); e outros números inteiros na piscina inteira grande. Em Cython, se definir uma lista vinculada para armazenar esses dados, onde buscar os dados se torna muito conveniente e rápido.

# ifndef NSMALLPOSINTS
    # define NSMALLPOSINTS 257
# endif

# ifndef NSMALLNEGINTS
    # define NSMALLNEGINTS 5
# endif

# if NSMALLPOSINTS + NSMALLNEGINTS > 0
    static PyIntObject * small_ints[NSMALLPOSINTS + NSMALLNEGINTS];
# endif

BTW: O número inteiro 257 talvez estranho; Se dois objetos que eles têm os mesmos valores estão no mesmo campo, seu endereço pode ser ou não o mesmo, depende do contexto do processo; Considerando que, se estiverem nos diferentes campos, seus endereços devem ser diferenças

E, a propósito, de acordo com o tipo de string, Cython também fornece um pool constante que o comprimento da string deve ser um, enquanto que pode não ser o mesmo objeto

a = str(11)
b = str(11)
print a == b      # True 
print a is b      # False

c = str("A")
d = str("A")   
print c == d    # True
print c is d    # True

aa = 12
bb = 12
print aa == bb    # True
print aa is bb    # True

cc = 333
dd = 333
print cc == dd    # True
print cc is dd    # False

Comparando seus endereços, está obtendo transparentemente as soluções antecipadas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top