Почему я не могу установить глобальную переменную в Python?
Как глобальные переменные работают в Python? Я знаю, что глобальные переменные злы, я просто экспериментирую.
Это не работает в python:
G = None
def foo():
if G is None:
G = 1
foo()
Я получаю сообщение об ошибке:
UnboundLocalError: local variable 'G' referenced before assignment
Что я делаю неправильно?
Ответы
Ответ 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
Вы по-прежнему получаете сообщение об ошибке, если оно определено перед использованием в цикле/независимо. В принципе нет ответа, а питон сосет.
Кроме того, переполнение стека отстойно, я прокомментирую здесь все, что мне нравится, потому что нет другого способа указать, что все эти ответы неверны.