¿Qué es un error lógico?
Un error lógico es un fallo en el razonamiento de un programa que le hace producir un resultado incorrecto sin fallar ni mostrar ningún mensaje de error. El código es válido y todas las líneas se ejecutan, pero no hace lo que el programador pretendía.
Actualizado el 24 de septiembre de 2026
Tres notas de examen, 80, 90 y 100, tienen una media de 90. Este programa se ejecuta sin una sola queja e imprime otra cosa:
Average: 203.33333333333334
Python hizo exactamente lo que dice la línea. La división se hace antes que la suma, así que solo la última nota se dividió entre 3, y el resultado es 80 + 90 + 33,33. El programador quería escribir (scores[0] + scores[1] + scores[2]) / 3. Añade los paréntesis y el programa imprime Average: 90.0.
Por qué no aparece ningún mensaje de error
Un ordenador comprueba si el código es válido, no si es correcto. El parser comprueba la gramática, lo que detecta un error de sintaxis. El runtime comprueba cada operación, lo que detecta un error en tiempo de ejecución como dividir entre cero. Sumar tres números y dividir uno de ellos entre 3 es gramática válida y una operación legal, así que ambas comprobaciones pasan.
Solo la persona que escribió el programa sabe que tenía que calcular una media. Esa intención no está en ninguna parte del código, así que ninguna herramienta puede comparar el resultado con ella. Un error lógico es la distancia entre lo que le dijiste al ordenador que hiciera y lo que querías que hiciera.
Causas comunes de los errores lógicos
La mayoría de los errores lógicos salen de una lista corta de patrones.
- Errores por uno (off-by-one). Un bucle se ejecuta una vez de más o de menos.
range(1, 5)produce 1, 2, 3 y 4, porque el final queda excluido. Consulta iteración. - Precedencia de operadores.
a + b / 2divide solob, como en la media de arriba. - La comparación equivocada.
<donde hacía falta<=, oanddonde hacía faltaor. Las condiciones son expresiones booleanas, y un solo operador equivocado invierte el resultado para algunas entradas. - Condiciones en el orden equivocado. En una cadena de
ifyelif, gana la primera condición verdadera, así que una comprobación amplia colocada primero oculta las más concretas que tiene debajo. - La variable equivocada. Actualizar
totaldentro de un bucle pero imprimirsubtotal. - Suposiciones sobre los números.
0.1 + 0.2 == 0.3esFalseen Python, Java y JavaScript, porque los números de coma flotante son aproximaciones.7 // 2es 3, no 3,5.
Este es el fallo del orden de las condiciones. Una nota de 95 debería ser una A:
D
D
F
95 es mayor o igual que 60, así que gana la primera rama y nunca se llega al elif. Pon primero el umbral más alto y todos los resultados salen bien.
Tipos de errores en programación
Los errores de programación se suelen clasificar en tres tipos según cuándo aparecen y quién los notifica.
| Error de sintaxis | Error en tiempo de ejecución | Error lógico | |
|---|---|---|---|
| Cuándo aparece | Antes de que el programa se ejecute | Mientras se ejecuta | Mientras se ejecuta, o nunca se nota |
| Qué lo detecta | El parser o el compilador | El runtime o el sistema operativo | Una persona o una prueba |
| ¿Se ejecuta el programa? | No | Hasta la línea que falla | Sí, hasta el final |
| Mensaje de error | Sí, con número de línea | Sí, con un traceback | Ninguno |
| Ejemplo en Python | if x > 3 sin los dos puntos | 10 / 0 | a + b / 2 para una media |
| Cómo lo encuentras | Leyendo el mensaje | Leyendo el traceback | Comparando la salida con una respuesta conocida |
Algunos libros de texto enumeran más tipos, y la mayoría caben dentro de estos tres. Un error de tipo que rechaza el compilador de Java, como incompatible types: String cannot be converted to int, se detecta en tiempo de compilación igual que un error de sintaxis, y algunos libros lo llaman error semántico. Un error de enlazado ocurre en el último paso de la construcción de un programa en C o C++, cuando una función se declaró pero su código no aparece por ninguna parte. Los errores aritméticos, de recursos y de archivos, como dividir entre cero, quedarse sin memoria o abrir un archivo que no existe, son todos errores en tiempo de ejecución. Algunos cursos usan además el término "error semántico" como otro nombre del error lógico, así que comprueba qué significado usa tu libro.
Cómo encontrar un error lógico
- Prueba con una respuesta que ya conozcas. Calcula a mano el resultado correcto para una entrada pequeña y compáralo. Tres notas son más fáciles de revisar que tres mil.
- Imprime los valores intermedios. Imprimir
scorey la rama elegida, o el contador del bucle en cada vuelta, muestra el paso exacto en el que la realidad se separa de tu plan. - Avanza paso a paso con un depurador. Poner un punto de interrupción y ejecutar línea a línea hace lo mismo sin tocar el código.
- Prueba los extremos. Prueba 0, 1, el valor más grande, una lista vacía y el umbral exacto (60 y 90 en el ejemplo de las notas).
- Explica el código en voz alta. Describir cada línea a otra persona, o a un patito de goma, te obliga a decir lo que la línea hace en lugar de lo que supones que hace.
Un assert convierte una respuesta conocida en una comprobación automática. No hace nada cuando la condición es verdadera y detiene el programa cuando es falsa:
Traceback (most recent call last):
File "main.py", line 10, in <module>
assert grade(95) == "A", "95 should be an A"
^^^^^^^^^^^^^^^^
AssertionError: 95 should be an A
Una prueba que falla convierte un error lógico silencioso en uno ruidoso con número de línea. Esa es toda la idea de las pruebas unitarias.
Errores lógicos en otros lenguajes
Los patrones son los mismos en todas partes, pero cada lenguaje tiene sus propias trampas. En JavaScript, "5" + 3 es la cadena "53", mientras que "5" - 3 es el número 2, así que un valor leído de un formulario como texto puede sumar mal sin ningún error. En C, if (x = 5) asigna 5 a x y siempre es verdadero. Clang lo advierte por defecto (using the result of an assignment as a condition without parentheses), pero aun así compila y se ejecuta, así que toma las advertencias del compilador tan en serio como los errores.
Qué leer después
Compara esta página con las de error de sintaxis y error en tiempo de ejecución para ver cómo se notifica cada tipo. Los bucles son donde viven los errores por uno, así que la página de iteración y la guía de Python sobre bucles for son buenas lecturas para seguir. Para practicar la búsqueda de resultados incorrectos en ejercicios reales, prueba el curso de Python.
Preguntas frecuentes
¿Qué diferencia hay entre un error de sintaxis y un error lógico?
¿Qué es un error lógico en Python?
range(1, 5) cuando querías del 1 al 5 incluido, a + b / 2 cuando querías (a + b) / 2 y ramas if comprobadas en el orden equivocado. Python no puede detectarlos, porque no tiene forma de saber qué querías decir.