Résumé : Pour résoudre un UnboundLocalError lorsque la variable locale est réaffectée après la première utilisation, vous pouvez utiliser le mot-clé global ou le mot-clé nonlocal. Le mot clé global vous permet de modifier les valeurs d’une variable globale à partir de la portée locale d’une fonction, tandis que le mot clé nonlocal fournit des fonctionnalités similaires en cas de fonctions imbriquées.

Problème: Étant donné une variable locale. Comment résoudre un UnboundLocalError lorsque la variable locale est réaffectée après la première utilisation ?

Exemple:

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

Sortie:

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

Avant de traiter les solutions à notre problème, nous devons comprendre la cause profonde derrière UnboundLocalError.

Cause première des erreurs UnboundLocalErrors :

Lorsqu’une variable est affectée dans une fonction, elle est traitée comme une variable locale par défaut en Python. Si une variable locale est référencée avant qu’une valeur ne lui ait été assignée/liée, un UnboundLocalError est déclenché. Dans l’exemple ci-dessus, lorsque la variable 'val' est lue par l’interpréteur Python à l’intérieur de la fonction func(), elle suppose que 'val' est une variable locale. Cependant, il se rend vite compte que la variable locale a été référencée avant qu’une valeur ne lui ait été attribuée dans la fonction. Ainsi, il lance un UnboundLocalError.

En d’autres termes, nous ne pouvons accéder qu’à une variable globale à l’intérieur d’une fonction mais ne pouvons pas la modifier à partir de la fonction (sauf si vous forcez une affectation globale ou non locale à l’aide des mots clés global ou nonlocal).

Remarque : La classe parente de toutes les exceptions Python est BaseException. Le diagramme suivant représente la hiérarchie des exceptions de UnboundLocalError.

 Hiérarchie d'exceptions UnboundLocalError

Maintenant que nous savons pourquoi et quand un UnboundLocalError est déclenché, examinons les solutions probables pour surmonter cette erreur.

Table des Matières

Méthode 1: En utilisant le mot-clé global

, nous pouvons utiliser le mot-clé global pour accéder et modifier une variable globale à partir de la portée locale d’une fonction. Toute variable créée en dehors d’une fonction est globale par défaut tandis que toute variable créée dans la fonction est locale par défaut. Ainsi, pour modifier une variable globale à partir de la fonction et éviter un UnboundLocalError, nous pouvons utiliser le mot clé global.

Jetons un coup d’œil au code suivant qui simplifie le concept ci-dessus:

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

Sortie:

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

Méthode 2: Utilisation du mot clé non local

Le mot clé nonlocal est utilisé lorsque nous avons une fonction imbriquée. Dans une telle situation, la portée locale d’une variable peut ne pas être définie, c’est-à-dire que la portée d’une variable n’est ni locale ni globale.

Jetons un coup d’œil à l’exemple suivant pour comprendre l’utilisation du mot clé nonlocal pour résoudre notre problème.

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()

Sortie

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

Dans le programme ci-dessus, le mot clé nonlocal est utilisé avec la variable val à l’intérieur de la fonction imbriquée foo() pour créer une variable non locale. Si la valeur de la variable nonlocal change, les modifications sont également reflétées dans la variable locale.

Avertissement: le mot-clé nonlocal ne fonctionne qu’en Python 3 et supérieur.

Méthode 3: L’utilisation d’un objet Mutable

Étant donné que nonlocal ne fonctionne pas dans les versions de Python antérieures à Python 3, vous pouvez utiliser un objet mutable comme un dictionnaire python, pour stocker les valeurs si vous ne souhaitez pas créer de variable globale.

Jetons un coup d’œil au programme suivant pour comprendre l’utilisation d’un objet mutable afin de surmonter le 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éthode 4: Passer des Paramètres À La Fonction

C’est la façon traditionnelle de résoudre notre problème. Au lieu d’utiliser une variable globale, nous pouvons passer des paramètres à la fonction définie pour éviter un UnboundLocalError. Jetons un coup d’œil au code suivant pour voir comment cela peut être fait:

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

Sortie:

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

Mot-clé global vs Mot-clé Non local

Avant de conclure cet article, examinons les principales différences entre une variable / mots-clés global et nonlocal .

  1. Contrairement au mot-clé global, le mot-clé nonlocal ne fonctionne qu’en Python 3 et supérieur.
  2. Le mot-clé global peut être utilisé avec des variables globales préexistantes ou de nouvelles variables alors que le mot-clé nonlocal doit être défini avec une variable préexistante.

Conclusion

De la discussion ci-dessus, nous avons appris que pour traiter UnboundLocalError dans notre code, nous pouvons utiliser l’une des méthodes suivantes:

  1. Utilisez le mot clé global .
  2. Utilisez le mot clé nonlocal en cas de fonctions imbriquées.
  3. Utilisez un objet mutable.
  4. Passer des paramètres à une fonction.

J’espère que vous avez trouvé cet article utile et qu’après l’avoir lu, vous pourrez traiter UnboundLocalError facilement. Restez à l’écoute pour des articles plus intéressants.

Où aller D’Ici ?

Assez de théorie, mettons un peu de pratique!

Pour réussir dans le codage, vous devez sortir et résoudre de vrais problèmes pour de vraies personnes. C’est ainsi que vous pouvez facilement devenir un salarié à six chiffres. Et c’est ainsi que vous perfectionnez les compétences dont vous avez vraiment besoin dans la pratique. Après tout, à quoi sert la théorie de l’apprentissage dont personne n’a jamais besoin?

Practice projects est la façon dont vous affûtez votre scie dans le codage!

Voulez-vous devenir un maître du code en vous concentrant sur des projets de code pratiques qui vous rapportent de l’argent et résolvent des problèmes pour les gens?

Alors devenez développeur indépendant Python ! C’est la meilleure façon d’aborder la tâche d’améliorer vos compétences en Python — même si vous êtes un débutant complet.

Rejoignez mon webinaire gratuit « Comment développer vos compétences Python à revenu élevé » et regardez comment j’ai développé mon activité de codage en ligne et comment vous le pouvez également – dans le confort de votre foyer.

Rejoignez le webinaire gratuit maintenant!