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.
La asignación cambia cómo se resuelve el nombre
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
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.
Referencia técnica: documentación oficial de excepciones de Python.