Область Python: UnboundLocalError: ссылка на локальную переменную 'c' перед назначением

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

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

Спасибо!


person all-too-human    schedule 28.09.2008    source источник


Ответы (4)


Внутри функции переменные, которым назначены, по умолчанию обрабатываются как локальные переменные. Чтобы назначить глобальные переменные, используйте оператор global:

def g(n):
    global c
    c = c + n

Это одна из необычных областей Python, которая никогда меня не устраивала.

person Greg Hewgill    schedule 28.09.2008
comment
Это похоже на PHP, но также требует использования 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
person ironfroggy    schedule 28.09.2008

Исправления для сообщения Грега:

Не должно быть до того, как на них будет сделана ссылка. Смотри:

x = 1
def explode():
    print x # raises UnboundLocalError here
    x = 2

Он взрывается, даже если x присваивается после ссылки на него. В Python переменная может быть локальной или ссылаться на внешнюю область видимости, и она не может изменяться в одной функции.

person Community    schedule 29.09.2008

Помимо того, что сказал Грег, в Python 3.0 будет нелокальный оператор, указывающий «вот некоторые имена, которые определены в охватывающей области». В отличие от глобальных, эти имена должны быть уже определены за пределами текущей области. Будет легко отследить имена и переменные. В настоящее время вы не можете быть уверены, где точно определено «глобальное что-то».

person Community    schedule 28.09.2008