3956 votes

Dans une fonction autre que celle qui les a créés à l’aide de variables globales

Si je crée une variable globale dans une fonction, comment puis-je utiliser cette variable dans une autre fonction ?
Je dois stocker la variable globale dans une variable locale de la fonction qui a besoin de son accès ?

5182voto

Paul Stephenson Points 17507

REMARQUE: En Python 3, variation globvar de global. Référence


Vous pouvez utiliser une variable globale dans d'autres fonctions en déclarant comme global dans chaque fonction qui assigne à celle-ci:

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 pour cela est que, depuis que les variables globales sont si dangereux, Python veut assurez-vous que vous savez vraiment qui est ce que vous êtes en train d'en exigeant clairement de l' global mot-clé.

Voir les autres réponses, si vous souhaitez partager une variable globale entre les modules.

909voto

Jeff Shannon Points 3439

Si je suis la compréhension de votre situation correctement, ce que vous voyez est le résultat de la façon Python gère local (fonction) et le global (module) les espaces de noms.

Disons que vous avez un module comme ceci:

# sample.py
myGlobal = 5

def func1():
    myGlobal = 42

def func2():
    print myGlobal

func1()
func2()

Vous pourriez vous attendent pour imprimer 42, mais au lieu de l'impression 5. Comme cela a déjà été mentionné, si vous ajoutez un "global" déclaration de func1(), puis func2() print 42.

def func1():
    global myGlobal
    myGlobal = 42

Ce qui se passe ici est que Python suppose que le nom qui est attribué à, n'importe où au sein d'une fonction est locale à cette fonction, sauf s'il est explicitement dit dans le cas contraire. Si c'est seulement la lecture à partir d'un nom, et le nom n'existe pas localement, il va essayer de trouver le nom dans tout contenant étendues (par exemple, le module de portée mondiale).

Lorsque vous affectez 42 pour le nom myGlobal, par conséquent, Python crée une variable locale que les ombres de la variable globale du même nom. Que le local est hors de portée et est le garbage collector quand func1() retourne; pendant ce temps, func2() ne peut jamais voir autre chose que de la (non modifié) nom global. Notez que cet espace de décision qui se passe au moment de la compilation, et non pas à l'exécution -- si vous étiez à la lecture de la valeur de myGlobal à l'intérieur de func1() avant d'attribuer à elle, vous obtiendrez un UnboundLocalError, parce que Python a déjà décidé qu'il doit être une variable locale, mais il n'a pas eu du tout de valeur associée avec elle encore. Mais en utilisant le "global" déclaration, vous dites à Python qu'il faut chercher ailleurs pour le nom au lieu de les affecter à l'échelle locale.

(Je crois que ce comportement trouve son origine principalement par le biais d'une optimisation locale des espaces de noms, sans ce comportement, Python VM devra effectuer au moins trois recherches de noms à chaque fois un nouveau nom est attribué à l'intérieur d'une fonction (pour s'assurer que le nom n'existe pas déjà au module/builtin niveau), qui permettrait de ralentir une opération très courante.)

279voto

gimel Points 30150

Vous voudrez peut-être explorer la notion d' espaces de noms. En Python, le module est le lieu naturel pour les mondiaux de données:

Chaque module a sa propre table de symbole, qui est utilisé comme le symbole mondial de la table 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 accidentelle des affrontements avec un utilisateur des variables globales. D'autre part, si vous savez ce que vous faites, vous pouvez toucher un module de variables globales avec la même notation utilisée pour désigner ses fonctions, modname.itemname.

Une utilisation spécifique du mondial-dans-un-module est décrit ici - how-do-i-share-global-variables-sur-modules:

La manière canonique pour partager les informations entre les modules au sein d'un seul programme est de créer un module de configuration (souvent appelé config ou cfg). Il suffit d'importer le module de configuration de tous les modules de votre application; le module devient alors disponible comme un nom global. Car il n'existe qu'une seule instance de chaque module, toutes les modifications apportées à l'objet module se reflètent partout. Par exemple:

Fichier: config.py

x = 0   # Default value of the 'x' configuration setting

Fichier: mod.py

import config
config.x = 1

Fichier: main.py

import config
import mod
print config.x

123voto

IfLoop Points 59461

Python utilise un simple heuristique de décider qui il scope doit charger une variable, entre local et global. Si un nom de variable apparaît sur le côté gauche d’une assignation, mais n’est pas déclaré global, il est supposé pour être locale. Si elle n’apparaît pas sur le côté gauche d’une assignation, il est supposé pour être global.

Voir comment baz, qui apparaît sur le côté gauche d’une assignation dans , est le seul variable.

78voto

J S Points 439

Si vous voulez faire référence à la variable globale dans une fonction, vous pouvez utiliser mondiale de mot-clé pour déclarer les variables sont globales. Vous n'avez pas à utiliser dans tous les cas (que quelqu'un tort claims) - si le nom référencé dans une expression ne peut pas être trouvé dans une portée locale ou étendues dans les fonctions de cette fonction est définie, il est recherché parmi les variables globales. Toutefois, si vous attribuez à une nouvelle variable non déclarée globale dans la fonction, il est implicitement déclarée comme local, et il peut faire de l'ombre à tout existant variable globale du même nom.

Aussi, les variables globales sont utiles, contrairement à ce que certains de la programmation orientée objet fanatiques qui prétendent le contraire - surtout pour les plus petits scripts, programmation orientée objet est exagéré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X