Maison  >  Article  >  développement back-end  >  Comment gérer les erreurs de variables locales non liées dans les étendues de fonctions imbriquées ?

Comment gérer les erreurs de variables locales non liées dans les étendues de fonctions imbriquées ?

DDD
DDDoriginal
2024-10-21 18:42:29609parcourir

How to Handle Unbound Local Variable Errors in Nested Function Scopes?

Résolution d'UnboundLocalError dans les étendues de fonctions imbriquées

L'interpréteur Python rencontre une UnboundLocalError lors de l'accès à une variable locale non liée dans une fonction imbriquée. Ce problème survient lorsqu'une fonction imbriquée tente de modifier une variable déclarée dans la fonction externe.

Exemple :

Considérez le code suivant :

<code class="python">def outer():
    ctr = 0

    def inner():
        ctr += 1

    inner()</code>

Lors de l'exécution de ce code, l'interpréteur génère l'erreur suivante :

Traceback (most recent call last):
  File "foo.py", line 9, in <module>
    outer()
  File "foo.py", line 7, in outer
    inner()
  File "foo.py", line 5, in inner
    ctr += 1
UnboundLocalError: local variable 'ctr' referenced before assignment

Cause :

Malgré les étendues imbriquées, la fonction interne ne peut pas accéder au 'ctr ' directement car elle est définie dans la fonction externe. Cela entraîne une variable non liée, déclenchant l'UnboundLocalError.

Solution :

Python 3 propose l'instruction « nonlocal » pour activer la rereliure de variables dans des étendues imbriquées. La modification du code pour inclure « nonlocal » résout le problème :

<code class="python">def outer():
    ctr = 0

    def inner():
        nonlocal ctr
        ctr += 1

    inner()</code>

Pour les utilisateurs de Python 2, des approches alternatives sont nécessaires :

  • Suppression du nom nu :
    Supprimez la variable ctr nue et placez-la dans une structure de données ou en tant qu'attribut. Par exemple, ctr = [0].
  • Réaffectation de variable :
    Réaffectez la variable ctr dans la fonction interne au lieu d'utiliser la reliure de nom nu : ctr = ctr 1.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn