Guía de diagnóstico

UnboundLocalError: Python considera el nombre local, pero aún no tiene valor

Este error aparece dentro de funciones cuando una asignación hace que Python trate un nombre como local y el código intenta leerlo antes de realizar esa asignación local.

Revisado 2026-09-30Ejemplos y diagnóstico

La asignación cambia cómo se resuelve el nombre

scope.py
contador = 0

def incrementar():
    print(contador)
    contador += 1

incrementar()

Como contador += 1 asigna al nombre dentro de la función, Python lo considera local en todo ese cuerpo. El print intenta leer ese local antes de que exista.

+= también es una asignación

Es fácil pensar que solo “lee y suma”, pero necesita leer el valor y después volver a asignarlo. Por eso activa la misma regla de ámbito que contador = contador + 1.

Prefiere pasar estado y devolver el nuevo valor

diseno.py
def incrementar(contador):
    return contador + 1

contador = 0
contador = incrementar(contador)
print(contador)

Este diseño hace visible la entrada y la salida de la función, facilita las pruebas y evita dependencia oculta de estado global.

global y nonlocal son herramientas, no parches

Pueden ser correctos cuando el diseño necesita modificar un nombre de un ámbito exterior, pero no deberían ser la primera respuesta a un error de alcance. Primero pregunta si la función puede recibir y devolver el estado.

Señal de que ya lo entiendesPuedes provocar este error con un ejemplo mínimo, explicar qué supuesto se rompió y elegir una corrección que conserve la intención del programa.

Referencia técnica: documentación oficial de excepciones de Python.