-1

重複の可能性:
Python での割り当てエラーの前に参照


それで、私は少し Python を独学しようと試み始めました。そして、すでに最初のエラーに直面しています。
「推測」をインクリメントしようとすると (推測の数を表示できるようにしたい)、else ステートメントで「推測」を割り当てたので、割り当てエラーの前に参照が表示されますが、これは理解できません。関数の開始前の値。

ここに私のコードがあります -

import random

def guessFunc():
    guess = input("Guess a number between 1 and 10: \n")
    guess = int(guess)

    if guess == num:
        print("Congratulations, you got it right")

    else:
        guesses += 1 
        guessFunc()


num = random.randint(1,10)
guesses = 1
guessFunc()

私をさらに混乱させているのは、

print(guesses)

関数の最初に、「推測」を割り当てた値が出力されます。関数がどのように値を確認して出力できるのか、実際にはわかりませんが、変更することはできません。

誰かがなぜこれが起こったのかを説明してくれたら、本当に感謝します.ローカル/グローバルの問題だと思いますが、よくわかりません.

4

2 に答える 2

2

Python スコープにより、外側のスコープからの値を読み取りのスコープに入れることができます。print()したがって、ステートメントで説明したように、関数からグローバルにアクセスして使用できます。

ただし、割り当てたい場合は、globalステートメントを使用して、ローカル値ではなくグローバルに割り当てたいことを Python に伝える必要がありglobal guessesます。ここにないので、割り当てが表示されるため、ローカル変数を作成する必要があると想定されますが+=、新しいローカル変数の既存の値が必要であり、もちろん存在しないため、エラーが発生します.

グローバルは一般的に悪い習慣と見なされており、関数が何をするのかを理解するのが非常に難しくなるため、避けるのが最善であることに注意してください。関数が値を返すようにして、それを処理する方がはるかに優れています。

あなたが望むことを行うためのより良い方法は、次のようなものです:

import random

def guessFunc():
    guesses = 0
    while guess != num:
        guess = input("Guess a number between 1 and 10: \n")
        guess = int(guess)
        guesses += 1 
    print("Congratulations, you got it right")
    return guesses

num = random.randint(1,10)
guesses = guessFunc()

Python では再帰が最適化されていないため、最初にループを使用してアクションを繰り返します。次に、関数から実行された推測の数を返し、グローバルを使用するのではなくwhile、に割り当てます。guesses

于 2012-12-10T17:26:09.820 に答える
0

関数内での使用はguesses、その名前のローカル変数を参照します。また、そのようなローカル変数を割り当てていないため、そこから読み取ろうとするとプログラムは失敗します。

グローバル変数を参照したいことをインタープリターに伝える必要があります。

def guessFunc():
    global guesses
    guess = input("Guess a number between 1 and 10: \n")
    guess = int(guess)

    if guess == num:
        print("Congratulations, you got it right")

    else:
        guesses += 1 
        guessFunc()
于 2012-12-10T17:26:33.107 に答える