2011-12-20 13 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 

どのようにすることができます私はこれをPythonの方法で解決しますか?それとも私は全く違う方法を取るべきですか?これを行うには、最も標準的な方法は、あなたのテストメソッドにパラメータを与えることである

+1

このように考えてみましょう。 'i1'や' i2'のような通常の変数は、関数に対してローカルであり、その外側には表示されません。関数 'input'は' test'で未知のローカル変数を作成します。 'test'でデータにアクセスしたい場合、そのデータはグローバルでなければならず(グローバル変数の' global'キーワードを参照)、関数引数を使って明示的に与えなければなりません(CédrickJulienの答えを参照)。経験則として、グローバル変数は可能な限り避けるべきです。 –

答えて

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(); test(i1、i2) 'を実行します。 –

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は、グローバル変数(プログラム全体にわたってアクセス可能)ではなく、ローカル変数として見られるようになり(それらがで定義されているのみアクセス可能内の機能 - これは例外を発生させた)