Область 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

Спасибо!

Ответы

Ответ 1

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

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

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

Ответ 2

Глобальное состояние - это то, чего следует избегать, особенно нужно его мутировать. Подумайте, должен ли 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

Ответ 3

Исправление для Greg post:

Не должно быть до того, как они будут указаны. Взглянуть:


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

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

Ответ 4

Кроме того, что Грег сказал в Python 3.0, будет заявлено нелокальное утверждение: "Вот некоторые имена, которые определены в охватывающей области". В отличие от глобальных эти имена должны быть определены за пределами текущей области. Будет легко отследить имена и переменные. В настоящее время вы не можете быть уверены, где точно определено "globals something".