2011-01-13 11 views
5

Duplicar posible:
Python '==' vs 'is' comparing strings, 'is' fails sometimes, why?cadenas Python Referencias de

Hola. Tengo una pregunta sobre cómo funciona Python cuando se trata de cómo y cuándo se usan las referencias.

Tengo un ejemplo aquí que entiendo.

a = "cat" 
b = a 
a is b 
    True 

Esto tiene sentido. Pero aquí viene algo que no entiendo.

a = "cat" 
b = "cat" 
a is b 
    True 
c = 1.2 
d = 1.2 
c is d 
    False 
e = "cat" 
f = "".join(a) 
e is f 
    False 

¿Por qué A es B de vuelta verdad y no C es D? Ambos tipos son inmutables ¿verdad? Y funcionó al usar los números flotantes Solo puedo imaginar que sea algún tipo de optimización, pero estoy feliz por cualquier respuesta.

También probé algunas otras cosas y dieron este resultado:

a = "cat" 
b = "c" 
c = b+"at" 
a is c 
    False # Why not same as setting c = "cat" 
d = "cat"+"" 
a is d 
    True # Probably same as setting d = "cat" 
e = "c"+"at" 
a is e 
    True # Probably same as setting e = "cat" 

supongo que este es el mismo problema aquí, pero ¿por qué no da la verdadera cuando la variable b se utiliza para crear "gato"?

que usar Python 2.5 si que haría cualquier differance

Algún consejo e ideas útiles aquí son apreciados.

+0

Python 2.6 y me estoy poniendo verdadero para 'c is d' en el segundo ejemplo. –

Respuesta

7
a = "cat" 
b = "cat" 
a is b 
    True 
c = 1.2 
d = 1.2 
c is d 
    False 

¿Por qué a is b retorno True y no c is d?

Bueno, la pregunta correcta sería "¿Por qué c is d retorno False y no a is b?", Ya que el comportamiento esperado lógico sería volver False - son objetos separados, creados en lugares separados.

La cosa es que la implementación actual de python escrita en C, Cpython, utiliza cadenas y pequeños cachés int como medio de optimización. La lógica detrás de esa optimización es que, dado que son inmutables de todos modos, no debería importar. Pero no debe confiar en ese comportamiento porque es específico de la implementación y no forma parte del lenguaje. Siempre use == para comparar cadenas, no is. == también tiene una optimización para tipos integrados inmutables, donde primero verifica la identidad, y solo si no son el mismo objeto, continúa con la prueba de igualdad. Por lo tanto, no debería importar en cuanto a rendimiento.

Parece que ya ha encontrado por qué no puede confiar en él en Cpython, en el resto de su pregunta.