Je sais que je devrais éviter d'utiliser des variables globales en premier lieu à cause d'une confusion comme celle-ci, mais si je devais les utiliser, est-ce que la manière suivante est valable pour les utiliser? (J'essaie d'appeler la copie globale d'une variable créée dans une fonction distincte.)
x = "somevalue"
def func_A ():
global x
# Do things to x
return x
def func_B():
x = func_A()
# Do things
return x
func_A()
func_B()
Est-ce x
que le que la deuxième fonction utilise a la même valeur que la copie globale x
qui func_a
utilise et modifie? Lors de l'appel des fonctions après la définition, l'ordre est-il important?
python
global-variables
Akshat Shekhar
la source
la source
Réponses:
Si vous voulez simplement accéder à une variable globale, vous utilisez simplement son nom. Cependant, pour changer sa valeur, vous devez utiliser le
global
mot - clé.Par exemple
Cela changerait la valeur de la variable globale à 55. Sinon, cela assignerait simplement 55 à une variable locale.
L'ordre des listes de définitions de fonctions n'a pas d'importance (en supposant qu'elles ne se réfèrent pas d'une manière ou d'une autre), l'ordre dans lequel elles sont appelées le fait.
la source
x
infunc_B
est une variable locale qui tire sa valeur de la valeur de retour de l'appel àfunc_A
- donc je suppose que cela en ferait votre (2)func_A
change la variable globale lors de chaque exécution et la retournefunc_B
à utiliser, alorsfunc_B
fonctionnera avec une valeur modifiée à chaque fois. Je ne suis pas sûr de votre "comment y remédier". Vous voudrez peut-être accepter la réponse la plus utile à votre question actuelle / originale, puis envisager d'ouvrir une autre question sur ce qui ressemble à une question de suivi.x.append("...")
, c'est la variable globale x qui est modifiée, car la locale fait référence à la globale.Dans une étendue Python, toute affectation à une variable non déjà déclarée dans cette étendue crée une nouvelle variable locale à moins que cette variable ne soit déclarée plus tôt dans la fonction comme faisant référence à une variable de portée globale avec le mot clé
global
.Regardons une version modifiée de votre pseudocode pour voir ce qui se passe:
En fait, vous pourriez tout réécrire
func_B
avec la variable nomméex_local
et cela fonctionnerait de manière identique.L'ordre n'a d'importance que dans la mesure où vos fonctions effectuent des opérations qui modifient la valeur du x global. Ainsi, dans notre exemple, l'ordre n'a pas d'importance, car les
func_B
appelsfunc_A
. Dans cet exemple, l'ordre importe:Notez que cela
global
n'est nécessaire que pour modifier des objets globaux. Vous pouvez toujours y accéder depuis une fonction sans déclarerglobal
. Ainsi, nous avons:Notez la différence entre
create_locally
etaccess_only
-access_only
accède au x global sans appelerglobal
, et même s'ilcreate_locally
n'utilise pas nonglobal
plus, il crée une copie locale car il attribue une valeur.La confusion ici est la raison pour laquelle vous ne devez pas utiliser de variables globales.
la source
Comme d'autres l'ont noté, vous devez déclarer une variable
global
dans une fonction lorsque vous voulez que cette fonction puisse modifier la variable globale. Si vous voulez seulement y accéder, vous n'en avez pas besoinglobal
.Pour entrer un peu plus dans les détails, ce que signifie "modifier" est le suivant: si vous voulez lier à nouveau le nom global pour qu'il pointe vers un objet différent, le nom doit être déclaré
global
dans la fonction.De nombreuses opérations qui modifient (mutent) un objet ne lient pas à nouveau le nom global pour pointer vers un autre objet et sont donc toutes valides sans déclarer le nom
global
dans la fonction.la source
Voici un cas qui m'a surpris, en utilisant un global comme valeur par défaut d'un paramètre.
Je m'attendais à ce que param ait une valeur de 42. Surprise. Python 2.7 a évalué la valeur de globVar lors de la première analyse de la fonction func. La modification de la valeur de globVar n'a pas affecté la valeur par défaut affectée à param. Le report de l'évaluation, comme ci-dessous, a fonctionné comme j'en avais besoin.
Ou, si vous voulez être en sécurité,
la source
is
pour vérifier si quelque chose estNone
, au lieu de la comparaison normale==
.Vous pouvez accéder directement à une variable globale à l'intérieur d'une fonction. Si vous souhaitez modifier la valeur de cette variable globale, utilisez "global variable_name". Voir l'exemple suivant:
D'une manière générale, ce n'est pas une bonne pratique de programmation. En brisant la logique de l'espace de noms, le code peut devenir difficile à comprendre et à déboguer.
la source
Vous devez utiliser la
global
déclaration lorsque vous souhaitez modifier la valeur affectée à une variable globale.Vous n'en avez pas besoin pour lire à partir d'une variable globale. Notez que l'appel d'une méthode sur un objet (même s'il modifie les données de cet objet) ne modifie pas la valeur de la variable contenant cet objet (en l'absence de magie réfléchissante).
la source
xs.append(xs.pop(0))
fonctionne très bien sansglobal xs
.