2008-09-28 128 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中,变量可以是本地的或引用外部作用域,并且它不能在一个函数中更改。