web-dev-qa-db-fra.com

Pourquoi ne puis-je pas définir une variable globale en Python?

Comment fonctionnent les variables globales en Python? Je sais que les variables globales sont mauvaises, je fais juste des expériences.

Cela ne fonctionne pas en python:

G = None

def foo():
    if G is None:
        G = 1

foo()

Je reçois une erreur:

UnboundLocalError: local variable 'G' referenced before assignment

Qu'est-ce que je fais mal?

31
slim

Vous avez besoin de l'instruction global :

def foo():
    global G
    if G is None:
        G = 1

En Python, les variables que vous affectez à deviennent des variables locales par défaut. Vous devez utiliser global pour les déclarer en tant que variables globales. D'un autre côté, les variables auxquelles vous faites référence mais que vous n'affectez pas ne deviennent pas automatiquement des variables locales. Ces variables font référence à la variable la plus proche dans une étendue englobante.

Python 3.x introduit l'instruction nonlocal qui est analogue à global, mais lie la variable à sa portée englobante la plus proche. Par exemple:

def foo():
    x = 5
    def bar():
        nonlocal x
        x = x * 2
    bar()
    return x

Cette fonction renvoie 10 lorsqu'elle est appelée.

62
Greg Hewgill

Vous devez déclarer G comme global, mais quant à la raison: chaque fois que vous faites référence à une variable à l'intérieur d'une fonction, si vous set la variable n'importe où dans cette fonction, Python suppose qu'il s'agit d'une variable locale. Donc, si une variable locale de ce nom n'existe pas à ce point du code, vous obtiendrez le UnboundLocalError. Si vous en fait destiné à faire référence à une variable globale, comme dans votre question, vous avez besoin du mot clé global pour dire Python c'est ce que vous vouliez dire.

Si vous n'affectez pas à la variable n'importe où dans la fonction, mais accédez uniquement à sa valeur, Python utilisera la variable globale par ce nom si elle existe. Vous pouvez donc faire:

G = None

def foo():
    if G is None:
        print G

foo()

Ce code affiche None et ne renvoie pas l'UnboundLocalError.

9
David Z

Vous devez toujours déclarer G comme global, à partir de cette fonction:

G = None

def foo():
    global G
    if G is None:
        G = 1

foo()
print G

qui sort simplement

1
8
Mark Rushakoff

Définissez G comme global dans la fonction comme ceci:

#!/usr/bin/python

G = None;
def foo():
    global G
    if G is None:
        G = 1;
    print G;

foo();

Ce qui précède python affiche 1.

L'utilisation de variables globales comme celle-ci est une mauvaise pratique car: http://c2.com/cgi/wiki?GlobalVariablesAreBad

2
Nope