2008-09-28 90 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中,變量可以是本地的或引用外部作用域,並且它不能在一個函數中更改。