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

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

DDD
DDDoriginal
2024-12-26 09:52:14237parcourir

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

UnboundLocalError expliqué dans les fermetures Python

La situation décrite dans la question tourne autour d'un concept fondamental en Python connu sous le nom de portée variable. Contrairement aux langages avec des déclarations de variables explicites, Python détermine la portée des variables en fonction de l'affectation.

Considérez le code suivant :

counter = 0

def increment():
  counter += 1

increment()

Ce code génère une UnboundLocalError. Pourquoi ?

En Python, une affectation au sein d'une fonction marque la variable comme locale à cette fonction. La ligne compteur = 1 dans la fonction incrément() implique que le compteur est une variable locale. Cependant, cette ligne tente d'accéder à la variable locale avant qu'elle ne soit affectée, ce qui conduit à l'erreur UnboundLocalError.

Pour contourner ce problème, vous disposez de plusieurs options :

  • Mot clé global : Si counter est destiné à être une variable globale, préfixez son affectation avec le mot-clé global à l'intérieur du function:
counter = 0

def increment():
  global counter
  counter += 1
  • Mot clé non local (Python 3.x): Si counter est une variable locale dans une fonction parent et incrément() est une fonction interne , vous pouvez utiliser le mot-clé nonlocal :
def outer():
  counter = 0

  def inner():
    nonlocal counter
    counter += 1

En utilisant ces techniques, vous pouvez manipuler correctement les variables locales et globales dans les fermetures, en évitant erreurs inutiles.

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