Identidad y Pertenencia (Etiquetas y Grupos)
Dos operadores que hacen preguntas muy concretas sobre las cajas del almacén. No son operadores de comparación genéricos: cada uno tiene un propósito puntual y usarlos donde no corresponde genera confusión.
1. Operadores de Pertenencia (in)
Preguntan: “¿Está este elemento DENTRO de este contenedor?”
Sirve para buscar en listas, tuplas, diccionarios o cadenas de texto. Corto, directo, y uno de los operadores más usados en la práctica real.
in: ¿Está adentro?not in: ¿NO está adentro?
invitados = ["Ana", "Beto", "Carla"]
usuario = "Daniel"
print(usuario in invitados) # False: Daniel no aparece
print("Ana" in invitados) # True: Ana sí está
print(usuario not in invitados) # True: la pregunta inversa
2. El Operador de Identidad (is)
Existe otro operador que parece comparar, pero hace algo distinto: is. No pregunta “¿valen lo mismo?” (eso es ==), sino “¿son exactamente el mismo estante?”: el mismo objeto físico en la memoria, no dos estantes con el mismo contenido.
Dos estantes pueden tener lo mismo dentro sin ser el mismo estante. == mira el contenido. is mira la identidad. (De hecho ya lo usaste: el Ejercicio 5.9 te hizo cazar un alias con is antes de tener el nombre formal.)
a = [1, 2, 3]
b = [1, 2, 3]
c = a
Antes de imprimir nada, predice: ¿qué da a == b? ¿Y a is b? ¿Y a is c?
print(a == b)
print(a is b)
print(a is c)
a == b da True: mismo contenido. a is b da False: son dos estantes distintos, aunque tengan lo mismo dentro. a is c da True: c es otra etiqueta sobre el MISMO estante que a.
En la práctica: úsalo solo con None
Para casi todo vas a usar ==. El único uso cotidiano de is es comprobar si una variable es None (la caja vacía reservada):
precio = None
print(precio is None) # True
print(precio is not None) # False
Para None siempre se escribe is None (o is not None), nunca == None. Es la convención oficial de Python (PEP 8) y la verás en todo código profesional.
¡Ojo!: no uses
ispara comparar valores. Escribirnumero is 5otexto is "hola"está mal, y Python te avisa: lanzaSyntaxWarning: "is" with 'int' literal. Did you mean "=="?. A veces “funciona por casualidad” con números pequeños (−5 a 256) porque Python reutiliza esos objetos internamente, pero es un accidente de implementación, no algo en lo que apoyarte. Para comparar contenido, siempre==.