web-dev-qa-db-fra.com

Utilisation correcte des variables globales dans Python 3

Quelle est l'utilisation correcte des variables globales dans Python 3?:

1) indiquant global VAR_NAME une fois dans le script de base (pas dans une fonction) et en faisant simplement référence à la variable comme VAR_NAME partout ailleurs

2) indiquant global VAR_NAME une fois dans chaque fonction qui utilise la variable globale, puis en faisant simplement référence à la variable comme VAR_NAME pour le reste de la fonction et dans le script principal lui-même

39
Eden Crow

Dans le premier cas, le mot-clé global est inutile, ce n'est donc pas correct. La définition d'une variable au niveau du module en fait une variable globale, vous n'avez pas besoin du mot-clé global.

Le deuxième exemple est une utilisation correcte.

Cependant, l'utilisation la plus courante des variables globales se fait sans utiliser le mot-clé global n'importe où. Le mot-clé global n'est nécessaire que si vous voulez réassigner les variables globales dans la fonction/méthode.

55
Lennart Regebro

Vous devez utiliser le mot clé global dans une fonction si vous utilisez la variable globale d'une manière qui, autrement, serait interprétée comme une affectation à une variable locale. Sans le mot-clé global, vous allez créer une variable locale qui masque le global dans la portée de la fonction.

Voici quelques exemples:

global_var = 1

def example1():
    # global keyword is not needed, local_var will be set to 1.
    local_var = global_var

def example2():
    # global keyword is needed, if you want to set global_var,
    # otherwise you will create a local variable.
    global_var = 2

def example3():
    # Without using the global keyword, this is an error.
    # It's an attempt to reference a local variable that has not been declared.
    global_var += 1
44
Dan Gerhardsson

"d'une manière qui serait autrement interprétée comme une affectation à une variable locale" --- oui, mais voici un détail subtil:

------------------- erreur: variable locale 'c' référencée avant affectation

def work():
  c += 3

c = 0

work()
print(c)

------------------- erreur: variable locale 'c' référencée avant affectation

c = 0

def work():
  c += 3

work()
print(c)

------------------- impressions [3]

def work():
  c.append(3)

c = []

work()
print(c)

------------------- impressions [3]

c = []

def work():
  c.append(3)

work()
print(c)
6
Boris T

La principale différence entre les deux premiers cas et les deux cas suivants dans la réponse ci-dessus devrait être le fait que la liste est modifiable. Pour des cas comme a = 1, un pointeur pointe vers l'emplacement où se trouve 1 et lorsque vous dites a = 2, le pointeur se déplace.

Pour le cas des objets mutables, un emplacement mémoire est attribué et lorsque des méthodes telles que l'ajout sont utilisées, des modifications se produisent sur l'emplacement mémoire lui-même et la valeur des références mutables est donc modifiée globalement.

Maintenant, la grande question est de savoir comment la fonction sait que la variable que nous modifions est une variable globale ou locale car il semble que nous pouvons modifier la variable globale si elle est mutable et nous ne pouvons pas si elle est non mutable (la fonction ne reconnaît pas non plus cela. comme variable globale)

1
Sharath