Maison >développement back-end >Tutoriel Python >Pourquoi « counter = 1 » à l'intérieur d'une fermeture provoque-t-il une « UnboundLocalError » en Python ?

Pourquoi « counter = 1 » à l'intérieur d'une fermeture provoque-t-il une « UnboundLocalError » en Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-26 18:09:10836parcourir

Why Does `counter  = 1` Inside a Closure Cause an `UnboundLocalError` in Python?

Comprendre l'erreur de variable locale non liée dans les fermetures

Lors de l'écriture de code à l'aide de fermetures, il est crucial de considérer la portée des variables. Dans ce cas particulier, la question se pose de savoir pourquoi une UnboundLocalError apparaît dans le code suivant :

counter = 0

def increment():
  counter += 1

increment()

Pour répondre à cette question, il faut d'abord comprendre le concept de fermeture en Python. Une fermeture est une fonction qui conserve l'accès aux variables définies dans la portée dans laquelle elle a été définie, même après la sortie de la portée. Dans ce cas, la variable compteur est définie dans la portée globale et est référencée dans la fonction incrément(), qui est considérée comme une fermeture.

Cependant, en Python, les variables au sein d'une fonction sont automatiquement traitées comme des variables locales. sauf indication contraire explicite. Lorsque le compteur de ligne = 1 est exécuté dans incrément(), l'interpréteur tente d'incrémenter la variable du compteur local. Cependant, comme aucune valeur n’a été affectée au compteur dans la fonction incrément(), il reste indépendant. Cela entraîne la levée de l'UnboundLocalError.

Pour résoudre ce problème, il existe deux approches principales :

  1. Utilisation du mot-clé global : si l'intention est pour counter est une variable globale, le mot-clé global peut être utilisé dans la fonction incrément() pour déclarer explicitement que counter doit faire référence à la variable globale plutôt qu'à une variable locale avec le même name.
counter = 0

def increment():
  global counter
  counter += 1

increment()
  1. Utilisation de nonlocal (Python 3.x uniquement) : Dans Python 3.x, le mot-clé nonlocal peut être utilisé dans une fonction imbriquée pour déclarer qu'une variable doit être traitée comme non locale, ce qui signifie qu'elle peut accéder à une variable portant le même nom dans le cadre portée.
counter = 0

def increment():
  nonlocal counter
  counter += 1

increment()

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