31. La globalisation est une mauvaise chose.

Supposons que vous et un de vos amis écrivez ensemble un long programme. Comme vous avez appris les bonnes pratiques en programmation, vous essayez toujours d'utiliser des noms descriptifs pour vos variables. Mais alors vous vous demandez : Et si mon ami utilisait les mêmes noms que moi pour une de ses variables ? Si je change la valeur de ma variable, ne changerai-je pas la sienne sans le vouloir ?

Python donne des moyens de vous aider à éviter ce genre de problèmes en utilisant les espaces de noms. Cela empêche une variable que nous voulons utiliser dans une petite partie d'un programme d'affecter d'autres parties. Nous allons commencer à étudier les espaces de noms dans cette leçon.


Variables définies localement.

Voici un exemple à essayer :

>>> a = 1
>>> def ma_fonction():
... a = 3
... print a
...

>>> ma_fonction()
3

>>> print a
1

Trouvez vous étonnant que la valeur de a n'a pas changé ? Voici ce qui s'est passé.

Vous avez commencé en définissant un nom de variable "a" avec sa valeur mise à 1. Ensuite, à l'intérieur d'une fonction, vous avez "apparemment" changé la valeur de "a" en 3. En réalité, ce que vous avez fait était de créer une nouvelle variable "a" à l'intérieur de la fonction, et vous lui avez donné une valeur de 3. La valeur de l'autre variable "a" est restée inchangée.

Python crée automatiquement un espace de nom à l'intérieur de chaque fonction, où les noms des variables définies prennent une valeur unique, indépendante de la façon dont les autres variables avec le même nom en dehors de la fonction pourraient être définies. Un espace de nom est comme un petit cahier dans lequel Python garde trace de tous les noms de variables. C'est comme si Python créait un cahier unique pour chaque fonction, pour que vous n'ayez pas à vous soucier de savoir si d'autres variables avec le même nom existent autre part.

Les variables utilisées à l'intérieur d'une fonction ne sont plus définies quand la fonction se termine ; nous disons qu'elles sont hors de portée.

>>> def fonction_simple():
... variable_locale = "Je suis ici !"
... print variable_locale
...
>>> fonction_simple()
Je suis ici !

>>> print variable_locale
Traceback (most recent call last):
File "<input>", line 1, in ?
NameError: name 'variable_locale' is not defined

Cette astuce d'espace de nom est sympathique, mais si nous voulions changer la valeur d'une variable à l'intérieur d'une fonction ? Par exemple, supposons que nous voulions garder trace du nombre de fois que nous appelons une certaine fonction. Nous pouvons le faire en utilisant le mot-clé Python global.

>>> nombre_de_fois = 0
>>> def enfant_de_deux_ans():
... global nombre_de_fois
... nombre_de_fois += 1
... print "Pourquoi ? %s fois" % nombre_de_fois
...
>>> enfant_de_deux_ans()
Pourquoi ? 1 fois

>>> enfant_de_deux_ans()
Pourquoi ? 2 fois

>>> enfant_de_deux_ans()
Pourquoi ? 3 fois

>>> print nombre_de_fois
3

En utilisant le mot-clé global, nous disons à Python de ne pas créer de nouvelle version de la variable localement à l'intérieur de la fonction, mais d'utiliser plutôt la variable qui porte ce nom "en dehors", dans ce qui s'appelle l'environnement "global".

Vous devriez toujours essayer de trouver des moyens d'éviter d'utiliser des variables globales si vous le pouvez, car elles peuvent introduire des changements indésirables dans d'autres parties du programme. En programmation, la globalisation est généralement une mauvaise chose.


Hors de portée

Larry et Curly marchent ensemble joyeusement. Soudain, Moe voit ses amis de loin et se met à courir vers eux. Juste au moment où il finit par rattraper Larry et Curly, il devient hors de portée et disparaît de l'écran. Si vous voulez qu'il reste avec ses amis, vous devrez supprimer trois symboles #.

Larry = UsedRobot(colour='blue')
Curly = UsedRobot(1, 3, colour='green')

# Utilisation de deux mots-clés que vous n'avez pas encore vus !
for i in range(3):
Larry.move()
Curly.move()

def attendez_moi():
#global Moe
Moe = UsedRobot(1, 2, colour='yellow')
# Utilisation des deux mêmes nouveaux mots-clés, encore !
for i in range(3):
Moe.move()
Larry.move()
Moe.move()
Curly.move()

attendez_moi()
# première image ci-dessous ; Moe est là.
Larry.move()
# deuxième image ci-dessous ; Moe a disparu.
Curly.move()
#Moe.move()
Larry.move()
Curly.move()
#Moe.move()
Larry.turn_off()

Moe est là

Moe a disparu


Essayez !

Essayez ce programme vous-même, dans le monde de Reeborg, puis changez le pour que Moe puisse rester avec ses amis !

previousProgrammation Orientée Objet : notation "pointée". - home - Nombreux retoursnext