L'acronyme LEGB (Local, Enclosing, Global, Built-in) désigne la règle de résolution des noms en Python.
Et comme Python utilise différents namespaces pour stocker les variables, il a besoin d'une règle pour savoir où chercher en cas de noms identiques : du plus spécifique au plus général. D'où le local, enclosing, global et built-in.
Que signifie LEGB ?
Voici l'ordre de priorité strict respecté par Python lors de la résolution d'un nom :
-
Local : Python cherche d'abord dans le namespace local, c'est-à-dire à l'intérieur de la fonction
-
Enclosing : s'il ne trouve rien en local, il cherche dans le namespace de la fonction parente si la fonction actuelle est imbriquée dans une autre. Le mot-clé
nonlocalpermet de modifier une variable de ce niveau depuis la fonction imbriquée. Je vous invite à lire le glossaire dédié -
Global : toujours rien ? Python cherche alors au niveau du module
-
Built-in : c'est le dernier recours, il s'agit des fonctions natives de Python (
print,len,sorted, etc.), des types (int,str,list, etc.), des exceptions (TypeError,ValueError, etc.) et des singletons (None,True,False)
À noter
Si rien n'est trouvé dans ces quatre niveaux, Python lève l'exception NameError.
print(patrick) # NameError: name 'patrick' is not defined
x = "Patrick est dans le niveau Global (G)" def fonction_englobante(): x = "Patrick est dans le niveau Englobant (E)" def fonction_locale(): x = "Patrick est dans le niveau Local (L)" # Python cherche 'x' en Local d'abord. Il le trouve ! print(f"Où suis-je ? {x}") fonction_locale() fonction_englobante() # Résultat : Où suis-je ? Patrick est dans le niveau Local (L)
Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.
Si vous supprimez la ligne x = "Patrick est dans le niveau Local (L)", Python ne trouvera rien au niveau local et passera au niveau enclosing :
x = "Patrick est dans le niveau Global (G)" def fonction_englobante(): x = "Patrick est dans le niveau Englobant (E)" def fonction_locale(): print(f"Où suis-je ? {x}") fonction_locale() fonction_englobante() # Résultat : Où suis-je ? Patrick est dans le niveau Englobant (E)
Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.
Et donc, si vous supprimez la ligne x = "Patrick est dans le niveau Englobant (E)", Python passera au niveau global :
x = "Patrick est dans le niveau Global (G)" def fonction_englobante(): def fonction_locale(): print(f"Où suis-je ? {x}") fonction_locale() fonction_englobante() # Résultat : Où suis-je ? Patrick est dans le niveau Global (G)
Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.
Quelques points de vigilance
Évitez l'écrasement des built-ins : ne nommez jamais une variable list, str, id, sorted, etc. Python trouverait votre variable avant la fonction native !
Le mot-clé global permet de modifier une variable globale depuis un espace local. Cependant, l'utilisation de global n'est pas considérée comme une bonne pratique, car elle rend le code difficile à maintenir. Il est préférable de passer la variable en paramètre de la fonction et de retourner une nouvelle valeur.
# Mauvaise pratique avec global compteur = 0 def incrementer_global(): global compteur compteur += 1 # Bonne pratique avec paramètres def incrementer(valeur): return valeur + 1 compteur = incrementer(compteur)
Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.