2009-08-15 2 views
26

Как глобальные переменные работают в Python? Я знаю, что глобальные переменные злы, я просто экспериментирую.Почему я не могу установить глобальную переменную в Python?

Это не работает в Python:

G = None 

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

foo() 

Я получаю сообщение об ошибке:

UnboundLocalError: local variable 'G' referenced before assignment 

Что я делаю неправильно?

ответ

56

Вам нужен global заявление:

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

В Python переменные , назначаемые становятся локальными переменными по умолчанию. Вы должны использовать global, чтобы объявить их глобальными переменными. С другой стороны, переменные, которые вы указали , но не присваиваете, автоматически не становятся локальными переменными. Эти переменные относятся к ближайшей переменной в охватывающей области.

Python 3.x представляет инструкцию nonlocal, которая аналогична global, но привязывает переменную к ее ближайшей охватывающей области. Например:

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

Эта функция возвращает 10 при вызове.

+0

s/variables/names/g s/назначить/привязать к/g –

+1

Да, можно использовать другую терминологию, но до тех пор, пока сам Python говорит о «переменных» и «присваивании» в сообщении об ошибке (как появляется в исходном вопросе), я думаю, что такая терминология вполне приемлема при объяснении проблемы. –

+0

Point принят! Языковая ссылка не всегда всегда согласуется с этим вопросом. –

6

Вы все еще должны объявить G как глобальные, в рамках этой функции:

G = None 

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

foo() 
print G 

, который просто выводит

1 
2

Определить G как глобальные в функции так:

#!/usr/bin/python 

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

foo(); 

Вышеупомянутые питоны печатают 1.

Использование глобальных переменных, как это плохая практика, потому что: http://c2.com/cgi/wiki?GlobalVariablesAreBad

8

Вам нужно объявить G, как global, но почему: каждый раз, когда вы обращаетесь к переменной внутри функции, если вы установить переменная в любом месте в этой функции Python предполагает, что это локальная переменная. Поэтому, если локальная переменная с этим именем не существует в этой точке кода, вы получите UnboundLocalError. Если вы на самом деле хотели ссылаться на глобальную переменную, как и в вашем вопросе, вам нужно указать ключевое слово global, чтобы сообщить Python, что вы имели в виду.

Если вы не назначаете переменную нигде в функции, но получаете доступ только к ее значению, Python будет использовать глобальную переменную по этому имени, если она существует. Таким образом, вы можете сделать:

G = None 

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

foo() 

Этот код печатает None и не бросает UnboundLocalError.