Область действия 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
Спасибо!
Решение
Внутри функции переменные, которым присвоены значения, по умолчанию рассматриваются как локальные переменные.Чтобы назначить глобальные переменные, используйте 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 будет нелокальный оператор, утверждающий: «вот несколько имен, которые определены во внешней области».В отличие от глобальных, эти имена должны быть уже определены за пределами текущей области.Будет легко отслеживать имена и переменные.В настоящее время вы не можете быть уверены, где точно определено «глобальное что-то».