2017-03-21 21 views
2

最近私に尋ねた後、申し訳ありません。私はこの問題を解決しようと太陽の下ですべてを試みましたが、私はそれを修正することはできません。あなたが私が何を試してきたのか分かっていれば、私はこのエラーを修正しようとしたすべての作業の後に私の頭が回転しているので、私の答えは「わからない」だろう。Python:グローバル名は定義されていません(しかし、グローバル変数ではありません)

def function1(): 
    if driver == "Steve Park" and season == "2000" 
     averageFinish = 10.0 
    return averageFinish 

def function2(): 
    momentum = int (input ("Enter the momentum for the driver: ")) 
    global driver, season 
    if driver == "Steve Park" and season == "2000" and momentum == "5" 
     newAverageFinish == function1() - 2.0 
    print(newAverageFinish) 
    return newAverageFinish 

def main(): 
    global driver 
    driver = input ("Enter a driver: ") 
    global season 
    season = int (input ("Enter a season: ")) 
    function1() 
    function2() 
    # Output should be 8.0 

出力は次のようになります。

Enter a driver: Steve Park 
Enter a season: 2000 
Traceback (most recent call last): 
File "<stdin>", line1, in <module> 
File "<stdin>", line6, in main 
File "<stdin>", line5, in function1 
Name Error: global name 'averageFinish' is not defined 

私はそれが平均的な仕上がりがグローバルであると考える理由はわかりません。また、ノートパソコンで使用しているキーボードが機能しないため、タブレットのコードを入力しました。私はアンドロイドアプリQPython3を使用しています。コンピュータのPythonインタプリタと比べて異なるエラーメッセージを生成するかどうかはわかりません。私がキーボードを手に入れるまで待たずにいる理由は、私の個人的なプログラムのアルゴリズムの仕上げを本当に心配しているからです。私のキーボードが来るまでQPython3で計画しているアルゴリズムをテストしています。

+0

'if'ステートメントにセミコロンがありません。そのコードはまったく動くべきではありません。 – tdelaney

+0

あなたの他の関数の引数として戻り値を使用し、グローバルで混乱を避け、非常にクリーンで簡単に従うことができます。 –

+0

このコードは、実行したことではありません。構文エラーがあり、 'function1'には5行がありません。私は、あなたのコードパスのすべてが値を設定するわけではないことに気付きます(driver == "Steve Park"とseason == "2000")がFalseならば、変数を決して設定しませんが、しかし、それは 'UnboundLocalError'となります。私はそれが実際のコードをその中の 'global'ステートメントと考えています。 – tdelaney

答えて

1

はコードの下に実行してみてください、私は、エラーメッセージの文言は、それがラインを実行したときに通訳がaverageFinishという名前のグローバル変数を見つけようとしていることを示し、あなたのコード内で持っていた問題、

def function1(): 
    if driver == "Steve Park" and season == 2000: 
     averageFinish = 10.0 
    return averageFinish 

def function2(): 
    momentum = int (input ("Enter the momentum for the driver: ")) 
    #momentum = 5 
    global driver, season 
    if driver == "Steve Park" and season == 2000 and momentum == 5: 
     newAverageFinish = function1() - 2.0 
    print(newAverageFinish) 
    return newAverageFinish 

def main(): 
    global driver 
    driver = input ("Enter a driver: ") 
    #driver = "Steve Park" 

    global season 
    season = int (input ("Enter a season: ")) 
    #season = 2000 

    function1() 
    function2() 
    # Output should be 8.0 

main() 
0

を修正しましたそのような変数は存在しないことに注意してください。 averageFinishはグローバル変数ではありません。しかし、通訳者は、function1の "if"ステートメントがfalseと評価された場合には定義されていないことが正しいです。偽の理由は、ユーザーが入力するとすぐにseasonintに変換しますが、ifステートメントではseasonを文字列と比較します。おそらくseason == 2000の代わりにseason == "2000"と書いてあります。

グローバル変数を使用して情報を渡すのではなく、引数を取る関数を記述することをお勧めします。しかし、それがこのプログラムが失敗している理由ではありません。

+0

定数でない限り、グローバルを使うのは好きではありません。グローバル定数にも反対ですか?それを私に説明してくれてありがとう。また、私はセミコロンを持っていた、私はポストにそれらを追加することを忘れました。あなたの説明は理にかなっています。私はすべてのユーザ入力が文字列に変換されているかどうかわからなかったと思った。 – TeamBills

+0

答えが正しい場合はそれを受け入れてください。私はあなたがセミコロンではなくコロンを意味すると信じています。グローバル定数は問題ありません。ユーザー入力は実際には文字列ですが、変数 'season'に代入する前にintに変換しています。したがって、その名前がintを参照する後続のロジックでは、私が知っているPythonやその他の言語では、 "2000"は文字列、2000はintです。 Pythonは、 '2000 ==" 2000 "という表現が受け入れられ、falseを評価する点で少し異例です。多くの言語でコンパイラまたは実行時エラーになります。 –

関連する問題