Область 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
Спасибо!
Ответы
Ответ 1
Внутри функции переменные, которые назначены, по умолчанию обрабатываются как локальные. Чтобы назначить глобальные переменные, используйте оператор global
:
def g(n):
global c
c = c + n
Это одна из причудливых областей Python, которая никогда не сидела хорошо со мной.
Ответ 2
Глобальное состояние - это то, чего следует избегать, особенно нужно его мутировать. Подумайте, должен ли 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
Ответ 3
Исправление для Greg post:
Не должно быть до того, как они будут указаны. Взглянуть:
x = 1
def explode():
print x # raises UnboundLocalError here
x = 2
Он взрывается, даже если x назначен после его ссылки.
В Python переменная может быть локальной или ссылаться на внешнюю область и не может меняться в одной функции.
Ответ 4
Кроме того, что Грег сказал в Python 3.0, будет заявлено нелокальное утверждение: "Вот некоторые имена, которые определены в охватывающей области". В отличие от глобальных эти имена должны быть определены за пределами текущей области. Будет легко отследить имена и переменные. В настоящее время вы не можете быть уверены, где точно определено "globals something".