5

一部の変数がローカルで一部がグローバルである理由を理解するのに少し苦労しています。たとえば、これを試すと:

from random import randint

score = 0

choice_index_map = {"a": 0, "b": 1, "c": 2, "d": 3}

questions = [
    "What is the answer for this sample question?",
    "Answers where 1 is a, 2 is b, etc.",
    "Another sample question; answer is d."
]

choices = [
    ["a) choice 1", "b) choice 2", "c) choice 3", "d) choice 4"],
    ["a) choice 1", "b) choice 2", "c) choice 3", "d) choice 4"],
    ["a) choice 1", "b) choice 2", "c) choice 3", "d) choice 4"]
]

answers = [
    "a",
    "b",
    "d"
]

assert len(questions) == len(choices), "You haven't properly set up your question-choices."
assert len(questions) == len(answers), "You haven't properly set up your question-answers."

def askQ():
    # global score
    # while score < 3:
        question = randint(0, len(questions) - 1)

        print questions[question]
        for i in xrange(0, 4):
            print choices[question][i]
        response = raw_input("> ")

        if response == answers[question]:
            score += 1
            print "That's correct, the answer is %s." % choices[question][choice_index_map[response]]
            # e.g. choices[1][2]
        else:
            score -= 1
            print "No, I'm sorry -- the answer is %s." % choices[question][choice_index_map[answers[question]]]
        print score

askQ()

次のエラーが表示されます。

Macintosh-346:gameAttempt Prasanna$ python qex.py 
Answers where 1 is a, 2 is b, etc.
a) choice 1
b) choice 2
c) choice 3
d) choice 4
> b
Traceback (most recent call last):
  File "qex.py", line 47, in <module>
    askQ()
  File "qex.py", line 39, in askQ
    score += 1
UnboundLocalError: local variable 'score' referenced before assignment

これで、スコアにエラーが発生する理由が完全に理解できました。私はそれをグローバルに設定しませんでした (これを示すために意図的にその部分をコメントアウトしました)。そして、私はそれを先に進めるためにwhile句を特に使用していません(そうしないと、句に入ることさえありません)。私を混乱させているのは、質問、選択肢、および回答に対して同じエラーが表示されない理由です。この 2 行のコメントを外すと、スクリプトは問題なく動作します。質問、回答、選択肢をグローバル変数として定義しなくても問題ありません。何故ですか?これは、他の質問を検索しても発見できなかった 1 つのことです。ここでは、Python に一貫性がないようです。リストを他の変数として使用することと関係がありますか? 何故ですか?

(また、初めてのポスターです。質問する必要がない間に発見したすべての助けに感謝します。)

4

3 に答える 3

5

に割り当てているからscoreです。および変数は読み取られるだけで、書き込まれませんquestionsanswers

変数に代入すると、その名前には現在のメソッド、クラスなどのスコープがあります。変数の値を取得しようとすると、最初に現在のスコープが試行され、次に外側のスコープが試行されます。一致が見つかります。

于 2012-11-13T03:12:13.810 に答える
2

グローバルがパーサーディレクティブであると考える場合、これは完全に理にかなっています

しているとき

score += 1 

に翻訳されます

score = score + 1

パーサーが 'score =' になると、インタープリターはローカル空間の外を検索しなくなります。

http://docs.python.org/2/reference/simple_stmts.html#global

于 2012-11-13T03:14:00.933 に答える
1

何が起こるかというと、Python はグローバル スコープをチェックする前に、ローカル スコープで変数をチェックします。したがって、 と に関してはquestionsanswersローカル スコープに設定されることはないため、Python はそれらが見つかるグローバル スコープに移動します。しかし、 の場合score、Python はユーザーが割り当て (score += 1またはscore -= 1) を行ったことを認識し、ローカル スコープにロックインします。しかしscore、これらのステートメントで言及すると、まだ存在しないため、Python は例外をスローします。

于 2012-11-13T03:16:00.720 に答える