Embora essa pergunta não tenha nenhum uso real na prática, estou curioso para saber como o Python faz o estágio de string. Eu percebi o seguinte.
>>> "string" is "string"
True
Isso é o que eu esperava.
Você também pode fazer isso.
>>> "strin"+"g" is "string"
True
E isso é muito inteligente!
Mas você não pode fazer isso.
>>> s1 = "strin"
>>> s2 = "string"
>>> s1+"g" is s2
False
Por que o Python não avaliaria s1+"g"
e perceberia que é o mesmo s2
e apontaria para o mesmo endereço? O que realmente está acontecendo naquele último bloco para que ele volte False
?
"string1" + "s2"
,10 + 3*20
, etc.) em tempo de compilação, mas limites decorrentes seqüências para apenas 20 elementos (para evitar[None] * 10**1000
a partir excessivamente expandir o seu bytecode). É essa otimização que entrou"strin" + "g"
em colapso"string"
; o resultado é menor que 20 caracteres.intern()
função.intern
função em Python 3 - ela foi movida para sys.internCaso 1
Caso 2
Agora, sua pergunta é por que o id é o mesmo no caso 1 e não no caso 2.
No caso 1, você atribuiu um literal de string
"123"
parax
ey
.Como a string é imutável, faz sentido para o interpretador armazenar a string literal apenas uma vez e apontar todas as variáveis para o mesmo objeto.
Portanto, você vê o id como idêntico.
No caso 2, você está modificando
x
usando concatenação. Ambosx
ey
têm os mesmos valores, mas não a mesma identidade.Ambos apontam para objetos diferentes na memória. Portanto, eles têm diferentes
id
e ois
operador retornouFalse
fonte
id(x) != id(x)
por exemplo, porque a string foi movida no processo de avaliação.x = "12" + "3"
emx = "123"
(concatenação de dois literais de string em uma única expressão), de modo que a atribuição realmente faz a pesquisa e encontra a mesma string "interna" dey = "123"
.