Indentación en Python: guía clara para principiantes

Publicado el: 11/07/2026
Tempo de leitura: 5 minutos
Homem pensando à frente de um notebook com código de programação

La indentación en Python no es solo una cuestión visual. Forma parte de la sintaxis y determina qué instrucciones pertenecen a una condición, un bucle, una función, una clase o cualquier otro bloque. En otros lenguajes, las llaves suelen marcar esos límites. Python utiliza espacios o tabulaciones, aunque la práctica recomendada es usar cuatro espacios por nivel.

Para comprender mejor este tema, revisa Python para principiantes, las funciones, los bucles, la guía de errores comunes y el artículo sobre PEP 8. También puedes consultar el apartado oficial sobre indentación y la guía oficial PEP 8.

Por qué Python usa indentación

La indentación obliga a mantener una estructura visual coherente. El bloque de una condición se ve claramente:

edad = 20

if edad >= 18:
    print("Mayor de edad")
    print("Acceso permitido")

print("Fin del programa")

Las dos primeras llamadas a print() pertenecen al if. La última está fuera porque vuelve al nivel inicial.

Cuatro espacios por nivel

La convención más utilizada es cuatro espacios:

def saludar(nombre):
    if nombre:
        mensaje = f"Hola, {nombre}"
        print(mensaje)
    else:
        print("Hola")

Cada bloque anidado añade cuatro espacios. Esto no significa que Python exija exactamente cuatro; exige consistencia. Sin embargo, seguir PEP 8 facilita el trabajo con editores, linters y otros desarrolladores.

IndentationError

Cuando un bloque esperado no está indentado, Python muestra IndentationError:

# Incorrecto
def sumar(a, b):
return a + b

La solución es indentar el cuerpo:

def sumar(a, b):
    return a + b

El mensaje suele indicar la línea donde se detectó el problema, pero conviene revisar también las líneas anteriores.

Unexpected indent

Una indentación sin bloque que la justifique también produce error:

# Incorrecto
nombre = "Ana"
    print(nombre)

La llamada debe estar en el mismo nivel:

nombre = "Ana"
print(nombre)

Unindent does not match

Este error aparece cuando una línea vuelve a un nivel que no coincide con los anteriores:

if True:
    print("A")
  print("B")

La segunda llamada tiene dos espacios, pero el bloque usa cuatro. Debe quedar fuera o dentro de forma consistente.

Tabulaciones y espacios

Un tabulador puede verse parecido a varios espacios, pero no es lo mismo. Mezclar ambos puede causar TabError o comportamientos confusos. Configura el editor para insertar espacios cuando presionas Tab.

En muchos editores puedes activar la visualización de caracteres invisibles. Esto ayuda a detectar tabulaciones, espacios finales y líneas con niveles diferentes.

Condiciones

temperatura = 32

if temperatura >= 30:
    print("Hace calor")
elif temperatura >= 20:
    print("Temperatura agradable")
else:
    print("Hace frío")

if, elif y else deben comenzar en el mismo nivel. Sus cuerpos deben tener un nivel adicional.

Bucles

for numero in range(3):
    print(f"Iteración {numero}")
    if numero == 1:
        print("Punto intermedio")

print("Bucle terminado")

El if está dentro del for y su llamada a print() está dentro del if. La última línea está fuera de ambos.

Funciones

def calcular_descuento(precio, porcentaje):
    if precio < 0:
        raise ValueError("Precio inválido")

    descuento = precio * porcentaje / 100
    return precio - descuento

La línea vacía no afecta la estructura. Lo que importa son los espacios al comienzo de las líneas con código.

Clases

class Usuario:
    def __init__(self, nombre):
        self.nombre = nombre

    def saludar(self):
        return f"Hola, soy {self.nombre}"

Los métodos están dentro de la clase y sus instrucciones están dentro de cada método.

Bloques vacíos

Un bloque no puede quedar completamente vacío. Utiliza pass como marcador:

def funcion_pendiente():
    pass

pass no hace nada, pero satisface la sintaxis. Conviene añadir un comentario o tarea pendiente para recordar que la implementación falta.

Continuación de líneas

Dentro de paréntesis, corchetes o llaves puedes dividir una expresión y usar una indentación visual:

usuario = {
    "nombre": "Ana",
    "roles": [
        "editor",
        "autor",
    ],
}

También puedes alinear argumentos:

resultado = calcular_total(
    precio=100,
    cantidad=3,
    descuento=10,
)

No uses barras invertidas si los delimitadores permiten una continuación implícita más clara.

Comprensiones multilínea

usuarios_activos = [
    usuario
    for usuario in usuarios
    if usuario["activo"]
]

La indentación aquí es principalmente visual porque la expresión está dentro de corchetes, pero mantener un patrón consistente mejora la lectura.

try, except y finally

try:
    numero = int(input("Número: "))
except ValueError:
    print("Entrada inválida")
else:
    print(f"Número válido: {numero}")
finally:
    print("Proceso terminado")

Las palabras clave relacionadas deben alinearse. Los cuerpos de cada bloque llevan un nivel adicional.

with

from pathlib import Path

ruta = Path("datos.txt")
with ruta.open("r", encoding="utf-8") as archivo:
    contenido = archivo.read()

print(contenido)

La lectura está dentro del contexto. La impresión ocurre después de cerrar el archivo.

match y case

comando = "guardar"

match comando:
    case "guardar":
        print("Guardando")
    case "salir":
        print("Saliendo")
    case _:
        print("Comando desconocido")

Cada case está dentro de match, y cada acción está dentro de su caso.

Errores lógicos sin excepción

Una indentación puede ser sintácticamente válida y lógicamente incorrecta:

def buscar(valor, elementos):
    for elemento in elementos:
        if elemento == valor:
            return True
        return False

return False está dentro del bucle, por lo que la función termina después del primer elemento. Debe estar fuera:

def buscar(valor, elementos):
    for elemento in elementos:
        if elemento == valor:
            return True
    return False

Este tipo de fallo no genera IndentationError. Las pruebas son necesarias para detectarlo.

Configurar el editor

Activa cuatro espacios por tabulación, formato automático, resaltado de parejas y visualización de espacios. Herramientas como Black, Ruff o el formateador del editor ayudan a mantener coherencia. Un linter también detecta bloques mal alineados, código inalcanzable y otros problemas.

Copiar código desde páginas o documentos

Al copiar código desde un PDF, procesador de texto o chat, pueden aparecer espacios especiales o perderse niveles. Pega primero en un editor de código, formatea el archivo y revisa las líneas marcadas. Evita ejecutar fragmentos que no comprendas.

Cómo corregir un archivo grande

Empieza por el primer error, no por todos a la vez. Activa guías verticales, pliega bloques y revisa dónde comienza cada estructura. Si el problema continúa, crea un ejemplo mínimo con el bloque afectado. También puedes ejecutar:

python -m py_compile programa.py

Este comando comprueba la sintaxis sin ejecutar la lógica principal.

Buenas prácticas

Mantén funciones pequeñas, evita demasiados niveles anidados y usa retornos tempranos cuando mejoren la claridad. No alinees código con espacios solo para crear columnas artificiales. La indentación debe representar estructura, no decoración.

Conclusión

La indentación define los bloques en Python. Usa cuatro espacios, evita mezclar tabulaciones y revisa cuidadosamente los niveles de condiciones, bucles, funciones y clases. Recuerda que un bloque puede ser sintácticamente correcto y aun así estar en el lugar lógico equivocado. Un editor bien configurado, un formateador y pruebas pequeñas convierten la indentación en una ayuda para la legibilidad, no en una fuente constante de errores.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Símbolo de repetição ao lado do logotipo do Python pensativo, representando o conceito de loops na programação em Python.
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Bucles en Python: for y while explicados con ejemplos

    Aprende bucles for y while en Python con range, enumerate, zip, break, continue, else, comprensiones, generadores y ejemplos prácticos.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    ícone de loop com o texto 'While' abaixo
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Bucles while en Python: guía práctica para principiantes

    Aprende bucles while en Python con condiciones, validación, menús, break, continue, else, centinelas, reintentos y buenas prácticas.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Imagem de um quadro negro com várias interrogações no lugar de lâmpadas, e uma lâmpada conectada no meio
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    If, elif y else en Python: guía de decisiones

    Aprende if, elif y else en Python con comparaciones, operadores lógicos, validación, rangos, menús, retornos tempranos y pruebas.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Manipulação de dados JSON em Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    JSON en Python: leer, escribir y validar datos

    Aprende JSON en Python con load, loads, dump, dumps, archivos UTF-8, validación, APIs, Decimal, fechas y escritura segura.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Logo do Python com símbolos de lista, tupla e dicionário
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Lista vs tupla vs set vs diccionario en Python

    Compara listas, tuplas, sets y diccionarios en Python según orden, mutabilidad, duplicados, búsquedas, conversiones y casos de uso.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Programador pensnado em frente à vários monitores com código na tela
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    15 ejercicios de Python para principiantes con soluciones

    Practica Python con 15 ejercicios resueltos sobre entrada, condiciones, bucles, funciones, listas, diccionarios, archivos y validación.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026