Maison  >  Article  >  développement back-end  >  Les fonctions imbriquées peuvent-elles modifier les variables dans les étendues englobantes en Python ?

Les fonctions imbriquées peuvent-elles modifier les variables dans les étendues englobantes en Python ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-21 18:40:03350parcourir

Can Nested Functions Modify Variables in Enclosing Scopes in Python?

Variables locales non liées dans les étendues de fonctions imbriquées

En Python, les fonctions imbriquées accèdent aux variables définies dans leurs étendues englobantes, permettant la réutilisation et l'encapsulation du code. Cependant, tenter de modifier une variable dans une portée englobante au sein d'une fonction imbriquée peut entraîner une « UnboundLocalError » si la variable n'est pas déclarée comme non locale ou globale.

Considérez le code suivant :

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

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

Lorsque vous invoquez inner(), vous rencontrerez une "UnboundLocalError" car ctr n'est pas défini dans la fonction interne. Pour résoudre ce problème, vous pouvez utiliser les approches suivantes :

Pour Python 3 et versions ultérieures :

Utilisez le mot-clé non local

Le mot-clé nonlocal vous permet pour modifier les variables définies dans une portée englobante à partir d'une fonction imbriquée.

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

    def inner():
        nonlocal ctr
        ctr += 1</code>

Pour Python 2 et versions antérieures :

Utiliser une structure de données pour contenir la variable

Dans Python 2, les fonctions imbriquées ne peuvent pas modifier les variables dans les étendues englobantes, vous devez donc utiliser une structure de données pour contenir la variable et la transmettre à la fonction imbriquée.

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

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

Remplacer toutes les occurrences de ctr dans votre code avec ctr[0].

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