2011-12-20 119 views
1

我剛開始編程,並試圖寫一些東西,但(當然)它失敗了。經過一段時間後,我遇到了真正的問題:UnboundLocalError。因此,爲了救你脫離所有的廢墟周圍我剝代碼到這一點:如何解決UnboundLocalError?

def test(): 
    try: 
     i1 = int(i1) 
     i2 = int(i2) 
    except ValueError: 
     print "you failed in typing a number" 

def input(): 
    i1 = raw_input('please type a number \n >') 
    i2 = raw_input('please type a number \n >') 

於是我寫下:

>>>input() 
please insert a number 
> 3 
please insert a number 
> 2 
>>>test() 

然後我:

that was not a number 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 7, in test 
UnboundLocalError: local variable 'i1' referenced before assignment 

哪有我用Pythonic的方式解決這個問題?或者我應該採取一種完全不同的方式?

+1

這樣想:常規變量如'i1'和'i2'對於函數是局部的,在其外部是不可見的。你的'input'函數創建'test'未知的局部變量。如果你想訪問'test'中的數據,那麼這些數據必須是全局的(見全局變量的''global''關鍵字),或者使用函數參數明確給出它(參見CédrickJulien的回答)。根據經驗,如果可能的話應該避免使用全局變量。 – 2011-12-20 09:43:44

回答

6

最標準的方法,這樣做是爲了給參數測試方法:

def test(i1, i2): 
    try: 
     i1 = int(i1) 
     i2 = int(i2) 
    except ValueError: 
     print "you failed in typing a number" 

def input(): 
    i1 = raw_input('please type a number \n >') 
    i2 = raw_input('please type a number \n >') 
    test(i1, i2) # here we call directly test() with entered "numbers" 

如果你真的想測試的交互提示,你可以做(​​如@FerdinandBeyer評論建議):

def test(i1, i2): 
    try: 
        i1 = int(i1) 
        i2 = int(i2) 
    except ValueError: 
        print "you failed in typing a number" 
    return i1, i2 
     
def input():  
    i1 = raw_input('please type a number \n >') 
    i2 = raw_input('please type a number \n >') 
    return i1, i2 

,然後在提示:

>>>var1, var2 = input() 
please insert a number 
> 3 
please insert a number 
> 2 
>>>test(var1, var2) 
+0

+1。 'input'應該返回變量,以便OP可以在交互提示中測試他的函數:'i1,i2 = input();測試(i1,i2)'。 – 2011-12-20 09:47:34

0

使用關鍵字 「全球」。

def test(): 
    global i1 
    global i2 
    try: 
     i1 = int(i1) 
     i2 = int(i2) 
    except ValueError: 
     print "you failed in typing a number" 

def input(): 
    global i1 
    global i2 
    i1 = raw_input('please type a number \n >') 
    i2 = raw_input('please type a number \n >') 

這將導致I1和I2被視爲全局變量(整個程序在訪問),而不是局部變量(只訪問他們中定義的功能 - 這導致例外)