Подтвердить что ты не робот

Почему я не могу установить глобальную переменную в Python?

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

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

G = None

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

foo()

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

UnboundLocalError: local variable 'G' referenced before assignment

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

4b9b3361

Ответ 1

Вам нужно 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 при вызове.

Ответ 2

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

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

G = None

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

foo()

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

Ответ 3

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

G = None

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

foo()
print G

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

1

Ответ 4

Определите 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

Ответ 5

Вы по-прежнему получаете сообщение об ошибке, если оно определено перед использованием в цикле/независимо. В принципе нет ответа, а питон сосет.

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