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

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

Это не работает в питоне:

G = None

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

foo()

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

UnboundLocalError: local variable 'G' referenced before assignment

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


person Community    schedule 15.08.2009    source источник
comment
Возможный дубликат Использование глобальных переменных в функции   -  person Abu Shoeb    schedule 17.12.2018


Ответы (4)


Вам понадобится оператор 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 при вызове.

person Greg Hewgill    schedule 15.08.2009
comment
s/variables/names/g s/назначить/связать с/g - person Ned Deily; 15.08.2009
comment
Да, можно использовать другую терминологию, но поскольку сам Python говорит о переменных и присваивании в сообщении об ошибке (как видно из исходного вопроса), я думаю, что такая терминология вполне приемлема при объяснении проблемы. - person Greg Hewgill; 15.08.2009
comment
Дело принято! Ссылка на язык также не всегда последовательна в этом вопросе. - person Ned Deily; 15.08.2009

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

G = None

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

foo()
print G

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

1
person Mark Rushakoff    schedule 15.08.2009

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

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

G = None

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

foo()

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

person David Z    schedule 15.08.2009

Определите G как глобальную функцию следующим образом:

#!/usr/bin/python

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

foo();

Приведенный выше питон печатает 1.

Подобное использование глобальных переменных является плохой практикой, потому что: /а>

person Nope    schedule 15.08.2009