Область видимости Python
Я пытаюсь выяснить это:
c = 1
def f(n):
print c + n
def g(n):
c = c + n
f(1) => 2
g(1) => UnboundLocalError: local variable 'c' referenced before assignment
Спасибо!
4 ответа
Внутри функции переменные, которые назначены, по умолчанию обрабатываются как локальные переменные. Чтобы назначить глобальные переменные, используйте global
заявление:
def g(n):
global c
c = c + n
Это одна из причудливых областей Python, которая мне никогда не нравилась.
Глобальное состояние - это то, чего следует избегать, особенно нужно его мутировать. Рассмотрим, если g()
следует просто взять два параметра или, если f()
а также g()
должны быть методы общего класса с c
атрибут экземпляра
class A:
c = 1
def f(self, n):
print self.c + n
def g(self, n):
self.c += n
a = A()
a.f(1)
a.g(1)
a.f(1)
Выходы:
2
3
Поправка к посту Грега:
Там не должно быть, прежде чем они ссылаются. Взглянуть:
x = 1
def explode():
print x # raises UnboundLocalError here
x = 2
Он взрывается, даже если x назначен после ссылки. В Python переменная может быть локальной или ссылаться на внешнюю область, и она не может изменяться в одной функции.
Кроме того, что сказал Грег, в Python 3.0 будет нелокальный оператор, утверждающий: "Вот некоторые имена, которые определены в прилагаемой области видимости". В отличие от глобальных, эти имена уже должны быть определены вне текущей области. Будет легко отслеживать имена и переменные. В настоящее время вы не можете быть уверены, где "глобальные переменные" точно определены.