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

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

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

G = None

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

foo()

Я получаю ошибку:

UnboundLocalError: local variable 'G' referenced before assignment

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

 Abu Shoeb17 дек. 2018 г., 05:03

Ответы на вопрос(4)

G = None

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

foo()
print G

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

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 при вызове.

 Ned Deily15 авг. 2009 г., 07:10
s / variable / names / g s / назначить / привязать к / g
 Ned Deily15 авг. 2009 г., 07:41
Дело принято! Ссылка на язык не всегда всегда соответствует этому вопросу.
 Greg Hewgill15 авг. 2009 г., 07:19
Да, можно использовать другую терминологию, но пока говорит сам Pythonпеременные» а также "назначение» в сообщении об ошибке (как показано в исходном вопросе) я думаю, что такая терминология вполне приемлема при объяснении проблемы.

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

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

G = None

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

foo()

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

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

Ваш ответ на вопрос