Вопрос

На этот вопрос уже есть ответ здесь:

Я пытаюсь понять это:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top