Espace de noms et portée Python
Espace de noms et portée Python
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 'Le Zen de Python' (tapez import this
dans l'interpréteur Python), la dernière ligne indique :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, quand on fait le devoir a = 2
, 2
est un objet stocké en mémoire et un 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))
Sortie
id(2) = 9302208 id(a) = 9302208
Ici, les deux font référence au même objet 2
, ils ont donc 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))
Sortie
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 schéma pour expliquer cela :
Initialement, un objet 2
est créé et le nom a lui est associé, quand on fait a = a+1
, un nouvel objet 3
est créé et maintenant un est associé à cet objet.
Notez que id(a)
et id(3)
ont les mêmes valeurs.
De plus, lorsque b = 2
est exécuté, le nouveau nom b est associé à l'objet précédent 2
.
Ceci est efficace car Python n'a pas à créer un nouvel objet en double. Cette nature dynamique de la liaison de noms 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 ces éléments sont valides et a fera référence à trois différents types d'objets dans différentes instances. Les fonctions sont aussi des objets, donc un nom peut également y faire référence.
def printHello():
print("Hello")
a = printHello
a()
Sortie
Hello
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 sur les 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 des fonctions intégrées telles que id()
, print()
etc. sont toujours disponibles pour nous à partir de 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 n'entre pas en conflit.
Les modules peuvent avoir diverses fonctions et classes. Un espace de noms local est créé lorsqu'une fonction est appelée, qui contient tous les noms qui y sont définis. Similaire est le cas avec la classe. Le diagramme suivant peut aider à clarifier ce concept.
Portée des variables 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 est accessible directement sans aucun préfixe.
À tout moment, il y a au moins trois portées imbriquées.
- Portée de la fonction actuelle qui a des noms locaux
- Portée du module qui a des noms globaux
- Portée la plus externe avec 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 à l'intérieur d'une autre fonction, une nouvelle portée est imbriquée dans la portée locale.
Exemple de champ d'application et d'espace de noms en Python
def outer_function():
b = 20
def inner_func():
c = 30
a = 10
Ici, la variable a se trouve dans l'espace de noms global. Variable b est dans l'espace de noms local de outer_function()
et c est dans l'espace de noms local imbriqué de inner_function()
.
Quand on est en inner_function()
, c est local pour nous, b est non local et a est mondial. Nous pouvons lire et attribuer de nouvelles valeurs à c mais ne peut lire que b et un à partir de inner_function()
.
Si nous essayons d'attribuer comme valeur à b , une nouvelle variable b est créé 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 un en tant que global, toutes les références et affectations vont au global a . De même, si nous voulons relier la variable b , il doit être déclaré comme non local. L'exemple suivant clarifiera cela davantage.
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 a sont définis 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 a en raison de l'utilisation du mot-clé global
.
Python
- Mots clés et identifiants Python
- Instruction Python, indentation et commentaires
- Variables, constantes et littéraux Python
- Conversion de type Python et conversion de type
- Entrée, sortie et importation Python
- Opérateurs Python
- Variables Python globales, locales et non locales
- Nombres Python, conversion de type et mathématiques
- Répertoire Python et gestion des fichiers