Область видимости 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

Спасибо!

4 ответа

Решение

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

Другие вопросы по тегам