Resumen: Para resolver un UnboundLocalError cuando la variable local se reasigne después del primer uso, puede usar la palabra clave global o la palabra clave nonlocal. La palabra clave global le permite modificar los valores de una variable global desde el ámbito local de una función, mientras que la palabra clave nonlocal proporciona una funcionalidad similar en el caso de funciones anidadas.

Problema: Dada una variable local. ¿Cómo resolver un UnboundLocalError cuando la variable local se reasigna después del primer uso?

Ejemplo:

val = 100def func(): val = val + 100 print(val)func()

Producto:

Traceback (most recent call last): File "C:/Users/Shubham-PC/PycharmProjects/pythonProject1/main.py", line 9, in <module> func() File "C:/Users/Shubham-PC/PycharmProjects/pythonProject1/main.py", line 5, in func val = val + 100UnboundLocalError: local variable 'val' referenced before assignment

Antes de tratar con las soluciones a nuestro problema, debemos entender la causa raíz detrás de UnboundLocalError.

Causa raíz De UnboundLocalErrors:

Cuando se asigna una variable dentro de una función, se trata como una variable local de forma predeterminada en Python. Si se hace referencia a una variable local antes de que se le haya asignado/vinculado un valor, se genera un valor UnboundLocalError . En el ejemplo anterior, cuando el intérprete de Python lee la variable 'val' dentro de la función func(), asume que 'val' es una variable local. Sin embargo, pronto se da cuenta de que la variable local ha sido referenciada antes de que se le haya asignado algún valor dentro de la función. Por lo tanto, lanza un UnboundLocalError.

En otras palabras, solo podemos acceder a una variable global dentro de una función, pero no podemos modificarla desde dentro de la función (a menos que fuerce una asignación global o no local utilizando las palabras clave global o nonlocal).

Nota: La clase padre de todas las excepciones de Python es BaseException. El siguiente diagrama representa la jerarquía de excepciones de UnboundLocalError.

 Jerarquía de excepciones Localerror sin límite

Ahora que sabemos por qué y cuándo se genera un UnboundLocalError , echemos un vistazo a las soluciones probables para superar este error.

Tabla de Contenidos

Método 1: Usando la palabra clave global

Podemos usar la palabra clave global para acceder y modificar una variable global desde el ámbito local de una función. Cualquier variable creada fuera de una función es global de forma predeterminada, mientras que cualquier variable creada dentro de la función es local de forma predeterminada. Por lo tanto, para modificar una variable global desde dentro de la función y evitar un UnboundLocalError podemos usar la palabra clave global.

Echemos un vistazo al siguiente código que simplifica el concepto anterior:

val = 100print("Value at First Usage: ", val)def func(): global val val = val + 100 print("Output after Modification within func(): ", val)func()

Producto:

Value at First Usage: 100Output after Modification within func(): 200

Método 2: Usando la palabra clave no local

La palabra clave nonlocal se usa cuando tenemos una función anidada. En tal situación, el alcance local de una variable podría no definirse, es decir, el alcance de una variable no es ni local ni global.

Echemos un vistazo al siguiente ejemplo para entender el uso de la palabra clave nonlocal para lidiar con nuestro problema.

def func(): val = 50 print("Output of func:", val) def foo(): nonlocal val val = val + 100 print("Output of foo:", val) foo() print("Output of func() after changes made to foo():", val)func()

Salida

Output of func: 50Output of foo: 150Output of func() after changes made to foo(): 150

En el programa anterior, la palabra clave nonlocal se utiliza con la variable val dentro de la función anidada foo() para crear una variable no local. Si el valor de la variable nonlocal cambia, los cambios también se reflejan en la variable local.

Descargo de responsabilidad: la palabra clave nonlocal solo funciona en Python 3 y versiones posteriores.

Método 3: Uso de un objeto mutable

Dado que nonlocal no funciona en versiones de Python anteriores a Python 3, puede usar un objeto mutable, como un diccionario de python, para almacenar los valores si no desea crear una variable global.

Echemos un vistazo al siguiente programa para comprender el uso de un objeto mutable con el fin de superar el UnboundLocalError.

variables = { # creating a mutable object/dictionary 'val': 100}print('Output before Modification of val: ', variables)def func(): variables += 50 print('Output after Modification of val: ', variables)func()
Output before Modification of val: 100Output after Modification of val: 150

Método 4: Pasar parámetros a la Función

Esta es la forma tradicional de resolver nuestro problema. En lugar de usar una variable global, podemos pasar parámetros a la función definida para evitar un UnboundLocalError. Echemos un vistazo al siguiente código para ver cómo se puede hacer esto:

val = 100print("Value of val at first use: ", val)def func(v): v = v + 100 print("Output of val after modification:", v)func(val)

Producto:

Value of val at first use: 100Output of val after modification: 200

Palabra clave global vs Palabra clave no local

Antes de concluir este artículo, echemos un vistazo a las diferencias clave entre una variable/palabra clave global y nonlocal .

  1. A diferencia de la palabra clave global, la palabra clave nonlocal solo funciona en Python 3 y versiones posteriores.
  2. La palabra clave global se puede usar con variables globales preexistentes o nuevas variables, mientras que la palabra clave nonlocal se debe definir con una variable preexistente.

Conclusión

De la discusión anterior aprendimos que para tratar con UnboundLocalError en nuestro código podemos usar uno de los siguientes métodos:

  1. Utilice la palabra clave global .
  2. Utilice la palabra clave nonlocal en el caso de funciones anidadas.
  3. Utilice un objeto mutable.
  4. Pasar parámetros a una función.

Espero que haya encontrado útil este artículo y que después de leerlo pueda tratar con UnboundLocalError con facilidad. Por favor, estén atentos para artículos más interesantes.

a Dónde Ir Desde Aquí?

Basta de teoría, ¡practiquemos un poco!

Para tener éxito en la codificación, debe salir y resolver problemas reales para personas reales. Así es como puedes convertirte en una fuente de ingresos de seis cifras fácilmente. Y así es como pules las habilidades que realmente necesitas en la práctica. Después de todo, ¿de qué sirve la teoría del aprendizaje que nadie necesita?

¡Los proyectos de práctica son la forma de afilar su sierra en la codificación!

¿Desea convertirse en un maestro de código centrándose en proyectos de código prácticos que realmente le ganen dinero y resuelvan problemas para las personas?

¡Entonces conviértete en un desarrollador freelance de Python! Es la mejor manera de abordar la tarea de mejorar tus habilidades en Python, incluso si eres un completo principiante.

Únase a mi seminario web gratuito «Cómo construir su Python de Habilidades de Altos Ingresos» y vea cómo hice crecer mi negocio de codificación en línea y cómo usted también puede hacerlo, desde la comodidad de su propio hogar.

¡Únase al seminario web gratuito ahora!