2010-08-04 18 views
6

duplicados posibles:
Types for which “is” keyword may be equivalent to equality operator in Python
Python “is” operator behaves unexpectedly with integersComparación de cadenas usando '==' y 'es'

Hola.

Tengo una pregunta que tal vez podría aclararme más de lo que estoy pidiendo.

Considera:

>>> x = 'Hello' 
>>> y = 'Hello' 
>>> x == y 
True 
>>> x is y 
True 

siempre he utilizado el operador de comparación. También leo que is compara la dirección de la memoria y por lo tanto en este caso, devuelve True

Entonces mi pregunta es, ¿es esta otra forma de comparar variables en Python? Si es así, ¿por qué no se usa?

También noté que en C++, si las variables tienen el mismo valor, sus direcciones de memoria son diferentes.

{ int x = 40; int y = 40; cout << &x, &y; } 
0xbfe89638, 0xbfe89634 

¿Cuál es la razón por la cual Python tiene las mismas direcciones de memoria?

Respuesta

9

Hay dos formas de verificar la igualdad en Python: == y is. == comprobará el valor, mientras que is comprobará la identidad. En casi todos los casos, si is es verdadero, entonces == debe ser verdadero.

A veces, Python (específicamente, CPython) optimizará los valores juntos para que tengan la misma identidad. Esto es especialmente cierto para cuerdas cortas. Python se da cuenta de que 'Hola' es lo mismo que 'Hola' y dado que las cadenas son inmutables, se vuelven lo mismo a través del interminado de cadenas/agrupación de cadenas.

Ver una pregunta relacionada: Python: Why does ("hello" is "hello") evaluate as True?

8

Esto se debe a una característica de Python llamada String interning que es un método de almacenamiento único copia de cada valor de cadena distinta.

+1

+1 por responder la pregunta en lugar de - por costumbre, supongo - diciendo "no" :) – delnan

+0

Estaba buscando este término. Gracias, leeré. Esta respuesta es lo que estoy preguntando. – user225312

+0

Has respondido la última pregunta, pero no las dos primeras. – MattH

11

Este es un detalle de implementación y absolutamente no se puede confiar en él. is compara identidades, no valores. Las cadenas cortas se internan, por lo que se asignan a la misma dirección de memoria, pero esto no significa que deba compararlas con is. Se adhiere al ==.

+0

Aah veo. Me apegaré a '==', sin embargo, quería estar seguro de que lo que estaba haciendo era correcto. – user225312

+0

Si las cadenas cortas están intercaladas o no depende de la implementación del intérprete que está utilizando, nunca podrá confiar en ello. –

1

En Python ambas cadenas y números enteros son inmutables por lo tanto usted puede caché de ellos. Los enteros en el rango de '-5' a '256 'y las cadenas pequeñas (no se conoce el tamaño exacto de atm) se almacenan en caché, por lo tanto, son el mismo objeto. x y y son solo nombres que hacen referencia a estos objetos.

También == se compara con valores iguales, mientras que is se compara con la identidad del objeto.NoneTrue y False son objetos globales, por ejemplo, puede volver a enlazar False a True.

A continuación se muestra que no todos los que se almacena en caché:

x = 'Test' * 2000 
y = 'Test' * 2000 

>>> x == y 
True 
>>> x is y 
False 

>>> x = 10000000000000 
>>> y = 10000000000000 
>>> x == y 
True 
>>> x is y 
False 
+0

Gracias por su respuesta. – user225312

1

En Python, las variables son sólo nombres que apuntan a un objeto (y que pueden apuntar al mismo objeto). En C++, las variables también definen la memoria real que está reservada para ellos; esta es la razón por la que tienen direcciones de memoria distintas.

Acerca de la cadena de Python y las diferencias entre los dos operadores de comparación, consulte carl's response.

+0

Sí, lo descubrí ahora. Gracias. – user225312

Cuestiones relacionadas