El operador is
le indica si dos variables apuntan al mismo objeto en la memoria. Rara vez es útil y a menudo se confunde con el operador ==
, que le indica si dos objetos "tienen el mismo aspecto".
Es particularmente confuso cuando se utiliza con cosas como literales de cadenas cortas, porque el compilador de Python las interna para su eficacia. En otras palabras, cuando escribe "xx"
el compilador (emite bytecode that) crea un objeto de cadena en la memoria y hace que todos los literales "xx"
apunten a él. Esto explica por qué tus primeras dos comparaciones son verdaderas. Observe que puede obtener la Identificación de las cuerdas llamando id
en ellos, que (al menos en CPython es probablemente) su dirección en la memoria:
>>> a = "xx"
>>> b = "xx"
>>> id(a)
38646080
>>> id(b)
38646080
>>> a is b
True
>>> a = "x"*10000
>>> b = "x"*10000
>>> id(a)
38938560
>>> id(b)
38993504
>>> a is b
False
El tercero es porque el compilador no ha internado las cuerdas a
y b
, por la razón que sea (probablemente porque no es lo suficientemente inteligente como para notar que la variable n
se define una vez y luego nunca se modifica).
En realidad, puede forzar a Python a aplicar cadenas internas, bueno, asking it to. Esto le dará una cantidad insignificante de aumento de rendimiento y podría ayudar. Probablemente sea inútil.
Moral: no use is
con cadenas literales. O int literales. O en cualquier lugar, no lo dices en serio.
¿Dónde diablos las personas aprenden sobre 'is', pero no sobre cómo es diferente de' == '? – delnan
posible duplicado de [Python '==' vs 'es' comparar cadenas, 'es' falla algunas veces, ¿por qué?] (Http://stackoverflow.com/questions/1504717/python-vs-is-comparing-strings-is -fails-sometimes-why) – SilentGhost
@SilentGhost: No exactamente, ya que esto se refiere al tema de cuándo los compiladores podrían internar cadenas inesperadamente. –