Operadores de comparación
Comprueba igualdad, desigualdad y orden, y encadena comparaciones en una sola expresión.
- Usar ==, !=, <, <=, >, >= para comparar valores
- Encadenar comparaciones como 0 <= x < 10
- Comprender en qué se diferencia == de is
- Comparar valores de tipos distintos
La computadora, puesta a decidir
Una evaluación 2 + 3 produce un número. Pero la mayor parte de lo que un programa necesita saber no es un número, es una decisión. ¿La nota aprueba? ¿El nombre de usuario está tomado? ¿La temperatura está dentro del rango? Los operadores de comparación son la rama de la familia aritmética que produce una respuesta del conjunto en lugar de .
Los seis operadores de comparación
Cada uno compara dos valores y produce un bool:
5 == 5 # True — igual
5 != 3 # True — distinto
5 < 10 # True — menor que
5 <= 5 # True — menor o igual
5 > 10 # False — mayor que
5 >= 5 # True — mayor o igualEn matemáticas escribirías , , ; Python opta por el <=, >=, != amigable con teclado. El significado no cambia. El doble igual == exige una pausa deliberada: es la pregunta “¿son iguales?”, mientras que un solo = es una orden de asignación. El signo duplicado evita que jamás colisionen.
Encadena comparaciones como un matemático
Supón que pertenece al intervalo . En papel escribes la condición de tres partes de un tirón, . Python te deja escribirlo exactamente así:
x = 5
0 <= x < 10 # True — se cumplen ambas condiciones
0 <= x < 3 # False — falla la segundaEs una sola expresión, evaluada con el mismo emparejamiento que leerías: y después , con el valor del medio calculado una sola vez. La comparación encadenada equivale a and , pero la forma encadenada se lee como la matemática de la que salió.
== pregunta por el contenido; is pregunta por la identidad
Dos preguntas suenan parecido y responden distinto:
a = [1, 2, 3]
b = [1, 2, 3]
a == b # True — mismo contenido
a is b # False — objetos distintos en memoria
c = a
a is c # True — el mismo objeto== compara los valores que se llevan; is compara las direcciones de memoria. Varias cajas pueden por casualidad tener la misma lista; solo hay un objeto. Los dos coinciden para cosas pequeñas (como los enteros pequeños que Python cachea) y divergen para todo lo demás, así que la regla es firme: usa == para contenido y reserva is para el único singleton que no tiene contenido que comparar, None:
if x is None: # correcto
if x == None: # funciona, pero te haces la pregunta equivocadaComparar entre tipos
Traer valores de conjuntos distintos a una comparación, frente a , sigue una política fija:
5 == 5.0 # True — la igualdad numérica ignora el tipo
"5" == 5 # False — una cadena y un int nunca son iguales
"5" < 6 # TypeError: '<' not supported between str and intSalen dos reglas. Para la igualdad, los valores numéricos se comparan por valor, no por tipo, mientras que valores de clases ajenas simplemente nunca son iguales. Para el orden, Python se niega a adivinar: no hay orden total que tenga sentido entre una cadena y un entero, así que lanza TypeError en lugar de inventar uno.
Un ejemplo resuelto: la tolerancia del recibo
La trampa del ruido de floats tiene respuesta constructiva. Compara con tolerancia como haría un físico, o cambia a unidades enteras exactas:
expected = 0.3
price = 0.1 + 0.2 # 0.30000000000000004
price == expected # False — ruido del float
abs(price - expected) < 1e-9 # True — dentro de la toleranciaEl patrón es un par de preguntas y una decisión: ¿son exactamente iguales? False. ¿Y dentro de una proximidad razonable? True. La segunda pregunta es la que el mundo real suele significar.
Errores comunes
=frente a==.if score = 60:es un error de sintaxis, Python no te deja asignar dentro de una condición por accidente. El signo duplicado es una barandilla, no una formalidad.- Igualdad de punto flotante.
0.1 + 0.2 == 0.3esFalse. La representación binaria de es infinita, así que la suma cae en . Compara dentro de una tolerancia en su lugar:abs((0.1 + 0.2) - 0.3) < 1e-10. ==conNone.x == Nonefunciona de casualidad;x is Nonees la pregunta que de verdad quieres hacer.- La igualdad de floats necesita tolerancia; el dinero necesita unidades enteras.
0.1 + 0.2 == 0.3falla (False), así que compara dentro deabs(a - b) < 1e-9o cuenta en centavos,120 == 12 * 10es exacto.
🧩 Desafíos
🧩 Desafío, piensa primero, luego revela
Predice cada resultado sin ejecutar: 5 == 5.0, "5" == 5, 5 < "6".
💡 Respuesta: 5 == 5.0 → True (igualdad numérica entre tipos), "5" == 5 → False (una cadena nunca es igual a un int), 5 < "6" → TypeError (el orden no está definido entre int y str en Python 3).
🧩 Desafío, piensa primero, luego revela
Escribe una sola comparación encadenada que compruebe si un número está en , sin usar and.
💡 Respuesta: 1 <= n <= 100, la forma encadenada se lee exactamente como el intervalo $1 \leq n \leq 100$.
🧩 Desafío, piensa primero, luego revela
¿Por qué 0.1 + 0.2 == 0.3 da False? ¿Cómo escribirías una prueba de igualdad de punto flotante correcta?
💡 Respuesta: Ni $0.1$ ni $0.2$ tienen representación binaria exacta, así que su suma es $0.30000000000000004$, no exactamente $0.3$. Prueba dentro de una tolerancia: abs((0.1 + 0.2) - 0.3) < 1e-10.
🤔 Preguntas socráticas
- Si
a == besTrue, ¿debe sera is btambiénTrue? ¿En qué circunstancias dos objetos pueden ser iguales en contenido y distintos en identidad? - ¿Por qué Python prohíbe
5 < "6"y a la vez permite que5 == "5"seaFalse? ¿Qué principio de diseño mantiene ambos comportamientos coherentes? - ¿Cuándo es
isde verdad la herramienta adecuada para la igualdad? Piensa en el singletonNone, y por qué comparar contenido ahí no tiene sentido.
✅ Comprobación rápida
1. ¿Cuánto es 5 == 5.0?
2. ¿A qué evalúa 0 <= 5 < 10?
3. ¿Cuál es la forma pitónica de comprobar si x es None?