Я пытаюсь понять это:
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
Спасибо!
Я пытаюсь понять это:
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
Спасибо!
Внутри функции переменные, которым назначены, по умолчанию обрабатываются как локальные переменные. Чтобы назначить глобальные переменные, используйте оператор global
:
def g(n):
global c
c = c + n
Это одна из необычных областей Python, которая никогда меня не устраивала.
global
.
- person Greg K; 06.07.2014
Глобального состояния следует избегать, особенно при необходимости его видоизменения. Подумайте, должен ли 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 будет нелокальный оператор, указывающий «вот некоторые имена, которые определены в охватывающей области». В отличие от глобальных, эти имена должны быть уже определены за пределами текущей области. Будет легко отследить имена и переменные. В настоящее время вы не можете быть уверены, где точно определено «глобальное что-то».