Python: ¿Por qué ("hola" es "hola") evalúa como verdadero?


Answers

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 lenguaje 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

Por lo tanto, no confíe en que 'string' es 'string': incluso si solo mira la implementación de C, no es seguro.

Question

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

Leí lo siguiente aquí :

Si dos literales de cadena son iguales, se han puesto 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?




Por qué es extraño Si la cuerda es inmutable, tiene mucho sentido guardarla solo una vez. .NET tiene el mismo comportamiento.




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

En el caso de literales de cadena, estos son internados, lo que significa que se comparan con 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.