Maison  >  Article  >  développement back-end  >  Comment résoudre UnboundLocalError dans les étendues de fonctions imbriquées en Python ?

Comment résoudre UnboundLocalError dans les étendues de fonctions imbriquées en Python ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-21 18:45:02989parcourir

How to Resolve UnboundLocalError in Nested Function Scopes in Python?

UnboundLocalError dans les étendues de fonctions imbriquées

En Python, l'accès à une variable définie dans une fonction externe à partir d'une fonction imbriquée peut parfois entraîner un UnboundLocalError. Prenons l'exemple suivant :

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

    def inner():
        ctr += 1

    inner()</code>

L'exécution de ce code générera une UnboundLocalError pour la variable ctr dans la fonction interne. Cette erreur se produit car Python traite ctr comme une variable locale dans la fonction interne, même si elle est définie dans la fonction externe. Pour résoudre ce problème, nous devons utiliser un mécanisme qui permet à la fonction interne d'accéder à la portée de la fonction externe.

Solution :

Python 3 a introduit le instruction nonlocal, qui permet la modification de variables non locales. En ajoutant nonlocal à la fonction interne, nous déclarons explicitement ctr comme variable non locale, permettant sa reliure au sein de la fonction interne.

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

    def inner():
        nonlocal ctr
        ctr += 1

    inner()</code>

Alternativement, dans Python 2, qui n'a pas le nonlocal, nous pouvons contourner ce problème en enfermant la variable counter dans une liste ou une autre structure de données pour éviter la reliure de nom nu :

<code class="python">ctr = [0]

def inner():
    ctr[0] += 1</code>

Cette approche maintient la valeur de ctr dans la liste ctr, empêchant la UnboundLocalError de se produire.

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