Espace de noms Python et portée d'une variable

Dans ce didacticiel, vous découvrirez l'espace de noms, le mappage des noms aux objets et la portée d'une variable.

Qu'est-ce que le nom en Python?

Si vous avez déjà lu 'The Zen of Python' (tapez import thisdans l'interpréteur Python), la dernière ligne indique que les espaces de noms sont une excellente idée - faisons-en plus! Alors, quels sont ces espaces de noms mystérieux? Voyons d'abord quel est le nom.

Le nom (également appelé identifiant) est simplement un nom donné aux objets. Tout en Python est un objet. Le nom est un moyen d'accéder à l'objet sous-jacent.

Par exemple, lorsque nous faisons l'affectation a = 2, 2un objet est stocké en mémoire et a est le nom auquel nous l'associons. Nous pouvons obtenir l'adresse (en RAM) d'un objet via la fonction intégrée id(). Voyons comment l'utiliser.

 # Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))

Production

 id (2) = 9302208 id (a) = 9302208

Ici, les deux font référence au même objet 2, donc ils ont le même id(). Rendons les choses un peu plus intéressantes.

 # Note: You may get different values for the id a = 2 print('id(a) =', id(a)) a = a+1 print('id(a) =', id(a)) print('id(3) =', id(3)) b = 2 print('id(b) =', id(b)) print('id(2) =', id(2))

Production

 id (a) = 9302208 id (a) = 9302240 id (3) = 9302240 id (b) = 9302208 id (2) = 9302208

Que se passe-t-il dans la séquence d'étapes ci-dessus? Utilisons un diagramme pour expliquer ceci:

Diagramme mémoire des variables en Python

Initialement, un objet 2est créé et le nom a lui est associé, lorsque nous le faisons a = a+1, un nouvel objet 3est créé et maintenant a est associé à cet objet.

Notez que id(a)et id(3)ont les mêmes valeurs.

De plus, lors de l' b = 2exécution, le nouveau nom b est associé à l'objet précédent 2.

Ceci est efficace car Python n'a pas besoin de créer un nouvel objet dupliqué. Cette nature dynamique de la liaison de nom rend Python puissant; un nom peut faire référence à n'importe quel type d'objet.

 >>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)

Tous ceux-ci sont valides et une référence à trois types d'objets différents dans des instances différentes. Les fonctions sont aussi des objets, donc un nom peut également y faire référence.

 def printHello(): print("Hello") a = printHello a()

Production

 Bonjour

Le même nom a peut faire référence à une fonction et nous pouvons appeler la fonction en utilisant ce nom.

Qu'est-ce qu'un espace de noms en Python?

Maintenant que nous comprenons ce que sont les noms, nous pouvons passer au concept d'espaces de noms.

Pour le dire simplement, un espace de noms est une collection de noms.

En Python, vous pouvez imaginer un espace de noms comme un mappage de chaque nom que vous avez défini aux objets correspondants.

Différents espaces de noms peuvent coexister à un moment donné mais sont complètement isolés.

Un espace de noms contenant tous les noms intégrés est créé lorsque nous démarrons l'interpréteur Python et existe tant que l'interpréteur s'exécute.

C'est la raison pour laquelle les fonctions intégrées telles que id(), print()etc. nous sont toujours disponibles depuis n'importe quelle partie du programme. Chaque module crée son propre espace de noms global.

Ces différents espaces de noms sont isolés. Par conséquent, le même nom qui peut exister dans différents modules ne se heurte pas.

Les modules peuvent avoir différentes fonctions et classes. Un espace de noms local est créé lorsqu'une fonction est appelée, qui contient tous les noms définis. Similaire, c'est le cas avec la classe. Le diagramme suivant peut aider à clarifier ce concept.

Un diagramme de différents espaces de noms en Python

Portée de variable Python

Bien qu'il existe différents espaces de noms uniques définis, nous ne pourrons peut-être pas accéder à tous à partir de chaque partie du programme. Le concept de portée entre en jeu.

Une portée est la partie d'un programme à partir de laquelle un espace de noms peut être accédé directement sans aucun préfixe.

À tout moment, il y a au moins trois étendues imbriquées.

  1. Portée de la fonction actuelle qui a des noms locaux
  2. Portée du module qui a des noms globaux
  3. Portée la plus externe qui a des noms intégrés

Lorsqu'une référence est faite à l'intérieur d'une fonction, le nom est recherché dans l'espace de noms local, puis dans l'espace de noms global et enfin dans l'espace de noms intégré.

S'il existe une fonction dans une autre fonction, une nouvelle portée est imbriquée dans la portée locale.

Exemple de portée et d'espace de noms en Python

 def outer_function(): b = 20 def inner_func(): c = 30 a = 10

Ici, la variable a est dans l'espace de noms global. La variable b se trouve dans l'espace de noms local de outer_function()et c est dans l'espace de noms local imbriqué de inner_function().

Quand nous sommes inner_function()dedans, c est local pour nous, b est non local et a est global. Nous pouvons lire et attribuer de nouvelles valeurs à c mais ne pouvons lire que b et a à partir de inner_function().

Si nous essayons d'attribuer une valeur à b, une nouvelle variable b est créée dans l'espace de noms local qui est différent du b non local. La même chose se produit lorsque nous attribuons une valeur à a.

Cependant, si nous déclarons a comme global, toutes les références et affectations vont au global a. De même, si nous voulons relier la variable b, elle doit être déclarée comme non locale. L'exemple suivant clarifiera davantage cela.

 def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

Comme vous pouvez le voir, la sortie de ce programme est

 a = 30 a = 20 a = 10

Dans ce programme, trois variables différentes sont définies dans des espaces de noms séparés et accessibles en conséquence. Dans le programme suivant,

 def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

La sortie du programme est.

 a = 30 a = 30 a = 30 

Ici, toutes les références et affectations sont au global en raison de l'utilisation de mot-clé global.

Articles intéressants...