Python: ¿Por qué (“hola” es “hola”) se evalúa como Verdadero?

¿Por qué "hello" is "hello" produce True en Python?

He leído lo siguiente aquí :

Si dos literales de cadena son iguales, se han colocado en la misma ubicación de memoria. Una cadena es una entidad inmutable. No se puede hacer daño.

Entonces, ¿hay un solo lugar en la memoria para cada cadena de Python? Suena bastante extraño. ¿Que está pasando aqui?

Related of "Python: ¿Por qué (“hola” es “hola”) se evalúa como Verdadero?"

Python (como Java, C, C ++, .NET) utiliza agrupación de cadenas / internado. El intérprete se da cuenta de que “hola” es lo mismo que “hola”, por lo que optimiza y usa la misma ubicación en la memoria.

Otro regalo: "hell" + "o" is "hello" ==> True

Entonces, ¿hay un solo lugar en la memoria para cada cadena de Python?

No, solo los que el intérprete ha decidido optimizar, que es una decisión basada en una política que no forma parte de la especificación del idioma y que puede cambiar en diferentes versiones de CPython.

p.ej. en mi instalación (2.6.2 Linux):

 >>> 'X'*10 is 'X'*10 True >>> 'X'*30 is 'X'*30 False 

de manera similar para ints:

 >>> 2**8 is 2**8 True >>> 2**9 is 2**9 False 

Así que no confíe en que ‘cadena’ es ‘cadena’: incluso mirando la implementación de C no es seguro.

Las cadenas literales probablemente se agrupan según su hash o algo similar. Dos de las mismas cadenas literales se almacenarán en la misma memoria, y cualquier referencia se referirá a eso.

  Memory Code ------- | myLine = "hello" | / |hello < | \ | myLine = "hello" ------- 

El operador is devuelve true si ambos argumentos son el mismo objeto. Su resultado es una consecuencia de esto, y el bit citado.

En el caso de los literales de cadena, estos se internan, lo que significa que se comparan con las cadenas conocidas. Si ya se conoce una cadena idéntica, el literal toma ese valor, en lugar de uno alternativo. Por lo tanto, se convierten en el mismo objeto, y la expresión es verdadera.

El intérprete / comstackdor de Python analiza los literales de cadena, es decir, la lista de caracteres citada. Cuando hace esto, puede detectar “He visto esta cadena antes” y usar la misma representación que la última vez. Puede hacerlo ya que sabe que las cadenas definidas de esta manera no se pueden cambiar.

¿Por qué es extraño? Si la cadena es inmutable, tiene mucho sentido almacenarla solo una vez. .NET tiene el mismo comportamiento.

Creo que si alguna de las dos variables (no solo las cadenas) contienen el mismo valor, el valor se almacenará solo una vez, no dos veces, y ambas variables apuntarán a la misma ubicación. Esto ahorra memoria.