2013-02-15 136 views
1

運行此代碼:蟒蛇本地範圍

import re 
regex = re.compile("hello") 
number = 0 
def test(): 
    if regex.match("hello"): 
    number += 1 

test() 

產生以下錯誤:

Traceback (most recent call last): 
    File "test.py", line 12, in <module> 
    test() 
    File "test.py", line 10, in test 
    number += 1 
UnboundLocalError: local variable 'number' referenced before assignment 

我爲什麼可以參考regex從裏面的函數,而不是number

+0

你還應該閱讀python [FAQ](http://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has這個確切的問題已經被回答了。如果你想知道更多[這裏](http://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python/)這篇文章。 – root 2013-02-15 06:18:45

回答

2

因爲您正在定義一個名爲number的新變量函數。

這裏是你的代碼確實有效:

def test(): 
    if regex.match("hello"): 
     number = number + 1 

當它看到number =,使number成Python的第一,儘快編譯此功能。任何參考number裏面的那個函數,無論它出現在哪裏,都會引用新的本地。全球受到影響。因此,當函數實際執行並且您嘗試計算number + 1時,Python會諮詢本地number,它尚未分配值。

這都是由於Python缺乏變量聲明:因爲你不明確聲明局部變量,所有變量聲明都隱含在函數的頂部處。

在這種情況下,你可以使用global number(在它自己的行)來告訴Python你總是想參考全局number。但首先避免需要這樣做通常會更好。你想要將某種行爲與某種狀態結合起來,而這正是對象的用途,所以你可以寫一個小類並只實例化一次。

+0

+1主要是因爲要避免使用全局變量(這使得這個答案脫穎而出)更好。 – 2013-02-15 06:09:09