¿Cómo puede una cadena no asignada en Python tener una dirección en la memoria?

¿Puede alguien explicarme esto? Así que he estado jugando con el comando id () en python y me encontré con esto:

>>> id('cat')
5181152
>>> a = 'cat'
>>> b = 'cat'
>>> id(a)
5181152
>>> id(b)
5181152

Esto tiene algún sentido para mí, excepto por una parte: la cadena 'cat' tiene una dirección en la memoria antes de asignarla a una variable. Probablemente no entiendo cómo funciona el direccionamiento de memoria, pero ¿alguien puede explicarme esto o al menos decirme que debería leer sobre direccionamiento de memoria?

Así que todo está bien, pero esto me confundió aún más:

>>> a = a[0:2]+'t'
>>> a
'cat'
>>> id(a)
39964224
>>> id('cat')
5181152

Esto me pareció extraño porque'gato' es una cadena con una dirección de 5181152 pero la nuevaa tiene una dirección diferente. Entonces, si hay dos'gato' cadenas en la memoria ¿por qué no se imprimen dos direcciones paraid ('gato')? Mi último pensamiento fue que la concatenación tenía algo que ver con el cambio de dirección, así que probé esto:

>>> id(b[0:2]+'t')
39921024
>>> b = b[0:2]+'t'
>>> b
'cat'
>>> id(b)
40000896

Hubiera predicho que las ID serían las mismas, pero ese no fue el caso. Pensamientos?

Respuestas a la pregunta(5)

Su respuesta a la pregunta