2008-09-28 4 views
38

Я пытаюсь выяснить это: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 

Спасибо!

ответ

51

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

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

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

+0

Это похоже на PHP, для этого также требуется использование `global`. – 2014-07-06 08:03:55

11

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

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

9

Опечатки для Greg's post:

Там не должно быть никаких , прежде чем они ссылаются. Посмотрите:

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

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

Смежные вопросы