Comment créer ou utiliser une variable globale dans une fonction ?
Si je crée une variable globale dans une fonction, comment puis-je utiliser cette variable globale dans une autre fonction ? Dois-je stocker la variable globale dans une variable locale de la fonction qui a besoin de son accès ?
Vous pouvez utiliser une variable globale dans d'autres fonctions en la déclarant comme global
dans chaque fonction qui lui est affectée :
globvar = 0
def set_globvar_to_one():
global globvar # Needed to modify global copy of globvar
globvar = 1
def print_globvar():
print(globvar) # No need for global declaration to read value of globvar
set_globvar_to_one()
print_globvar() # Prints 1
J'imagine que la raison en est que, puisque les variables globales sont si dangereuses, Python veut s'assurer que vous savez vraiment avec quoi vous jouez en exigeant explicitement le mot-clé global
.
Voir les autres réponses si vous voulez partager une variable globale entre plusieurs modules.
Vous voudrez peut-être explorer la notion d'[espaces de noms][1]. En Python, le [module][2] est l'endroit naturel pour les données globales :
Chaque module possède sa propre table de symboles privée, qui est utilisée comme table de symboles globale par toutes les fonctions définies dans le module. Ainsi, l'auteur d'un module peut utiliser des variables globales dans le module sans se soucier de conflits accidentels avec les variables globales d'un utilisateur. D'autre part, si vous savez ce que vous faites, vous pouvez toucher les variables globales d'un module avec la même notation utilisée pour faire référence à ses fonctions,
modname.itemname
.
Une utilisation spécifique de global-in-a-module est décrite ici - [How do I share global variables across modules ?][3], et pour être complet le contenu est partagé ici :
La manière canonique de partager des informations entre les modules d'un même programme est de créer un module de configuration spécial (souvent appelé config ou cfg). Il suffit d'importer le module de configuration dans tous les modules de votre application ; le module devient alors disponible en tant que nom global. Comme il n'existe qu'une seule instance de chaque module, toute modification apportée à l'objet du module est répercutée partout. Par exemple :
Fichier : config.py
x = 0 # Valeur par défaut du paramètre de configuration 'x'.
Fichier : mod.py
import config config.x = 1
Fichier : main.py
import config import mod print config.x
[1] : http://docs.python.org/reference/datamodel.html [2] : http://docs.python.org/tutorial/modules.html [3] : http://effbot.org/pyfaq/how-do-i-share-global-variables-across-modules.htm
Si vous voulez faire référence à une variable globale dans une fonction, vous pouvez utiliser le mot-clé global pour déclarer quelles variables sont globales. Vous ne devez pas l'utiliser dans tous les cas (comme quelqu'un ici le prétend à tort) - si le nom référencé dans une expression ne peut pas être trouvé dans la portée locale ou dans les portées des fonctions dans lesquelles cette fonction est définie, il est recherché parmi les variables globales.
Cependant, si vous assignez à une nouvelle variable non déclarée comme globale dans la fonction, elle est implicitement déclarée comme locale, et elle peut éclipser toute variable globale existante portant le même nom.
De plus, les variables globales sont utiles, contrairement à ce que prétendent certains zélateurs de la POO - surtout pour les petits scripts, où la POO est inutile.