¿Existe alguna diferencia entre "==" y "es"?

Resuelto Bernard asked hace 16 años • 13 respuestas

Mi Google-fu me ha fallado.

En Python, ¿son equivalentes las siguientes dos pruebas de igualdad?

n = 5
# Test one.
if n == 5:
    print 'Yay!'

# Test two.
if n is 5:
    print 'Yay!'

¿Esto es cierto para los objetos en los que compararía instancias (por listejemplo)?

Bien, entonces esto responde a mi pregunta:

L = []
L.append(1)
if L == [1]:
    print 'Yay!'
# Holds true, but...

if L is [1]:
    print 'Yay!'
# Doesn't.

Entonces, ¿ ==las pruebas valoran dónde isse prueban para ver si son el mismo objeto?

Bernard avatar Sep 25 '08 19:09 Bernard
Aceptado

isRetornará Truesi dos variables apuntan al mismo objeto (en memoria), ==si los objetos a los que hacen referencia las variables son iguales.

>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True

# Make a new copy of list `a` via the slice operator, 
# and assign it to variable `b`
>>> b = a[:] 
>>> b is a
False
>>> b == a
True

En su caso, la segunda prueba solo funciona porque Python almacena en caché pequeños objetos enteros, lo cual es un detalle de implementación. Para números enteros más grandes, esto no funciona:

>>> 1000 is 10**3
False
>>> 1000 == 10**3
True

Lo mismo ocurre con los literales de cadena:

>>> "a" is "a"
True
>>> "aa" is "a" * 2
True
>>> x = "a"
>>> "aa" is x * 2
False
>>> "aa" is intern(x*2)
True

Por favor vea esta pregunta también.

Torsten Marek avatar Sep 25 '2008 12:09 Torsten Marek

Existe una regla general sencilla que le indica cuándo utilizar ==o is.

  • ==es para la igualdad de valores . Úselo cuando desee saber si dos objetos tienen el mismo valor.
  • ises para igualdad de referencia . Úselo cuando desee saber si dos referencias se refieren al mismo objeto.

En general, cuando comparas algo con un tipo simple, generalmente verificas la igualdad de valores , por lo que debes usar ==. Por ejemplo, la intención de su ejemplo probablemente sea verificar si x tiene un valor igual a 2 ( ==), no si xse refiere literalmente al mismo objeto que 2.


Algo más a tener en cuenta: debido a la forma en que funciona la implementación de referencia de CPython, obtendrá resultados inesperados e inconsistentes si utiliza por error iscomparar la igualdad de referencia en números enteros:

>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False

Eso es más o menos lo que esperábamos: ay btienen el mismo valor, pero son entidades distintas. ¿Pero qué pasa con esto?

>>> c = 200
>>> d = 200
>>> c == d
True
>>> c is d
True

Esto es inconsistente con el resultado anterior. ¿Que está pasando aqui? Resulta que la implementación de referencia de Python almacena en caché objetos enteros en el rango -5..256 como instancias singleton por razones de rendimiento. Aquí hay un ejemplo que demuestra esto:

>>> for i in range(250, 260): a = i; print "%i: %s" % (i, a is int(str(i)));
... 
250: True
251: True
252: True
253: True
254: True
255: True
256: True
257: False
258: False
259: False

Esta es otra razón obvia para no usarlo is: el comportamiento se deja en manos de las implementaciones cuando lo usas erróneamente para la igualdad de valores.

John Feminella avatar Jul 06 '2009 06:07 John Feminella