¿Se guardan las cadenas en caché?

>>> a = "zzzzqqqqasdfasdf1234" >>> b = "zzzzqqqqasdfasdf1234" >>> id(a) 4402117560 >>> id(b) 4402117560 

pero

 >>> c = "!@#$" >>> d = "!@#$" >>> id(c) == id(d) False >>> id(a) == id(b) True 

¿Por qué obtener el mismo resultado id () solo cuando se asigna una cadena?

Editado: Reemplazo “cadena ascii” con solo “cadena”. Gracias por la retroalimentación

No se trata de ASCII frente a no ASCII (su “no ASCII” sigue siendo ASCII, es solo puntuación, no alfanumérica). CPython, como detalle de implementación, interna constantes de cadena que contienen solo “nombres de caracteres” . “Caracteres de nombre” en este caso significa lo mismo que el regex escape \w : alfanumérico, además de subrayado.

Nota: Esto puede cambiar en cualquier momento, y nunca se debe confiar en él, es solo una optimización que utilizan.

En una conjetura, esta elección se hizo para optimizar el código que usa getattr y setattr , setattr por un puñado de literales de cadenas, etc. todas (cuando dos cadenas están internadas, son definitoriamente o bien el mismo objeto, o no son iguales, por lo que puede evitar leer sus datos por completo).