我很难理解为什么有些变量是局部变量而有些变量是全局变量。例如。当我尝试这个时:
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子句让它继续前进(否则它甚至不会进入该子句)。令我困惑的是,为什么它没有给我同样的问题,选择和答案的错误。 当我取消注释这两行时,即使没有我将问题,答案和选择定义为全局变量,脚本也能正常工作。为什么会这样?这是我通过搜索其他问题而无法发现的一件事 - 这里似乎Python不一致。是否与我使用列表作为其他变量有关?那是为什么?
(另外,第一次发布海报;非常感谢我在没有人提出问题时发现的所有帮助。)
答案 0 :(得分:5)
这是因为您要分配给score
。 questions
和answers
变量仅被读取,而不是写入。
当您为变量赋值时,该名称具有您所在的当前方法,类等的范围。当您尝试获取变量的值时,它首先尝试当前范围,然后是外部范围,直到找到匹配。
答案 1 :(得分:2)
如果你认为全局是一个解析器指令
,这就完全有道理了当你做的时候
score += 1
被翻译为
score = score + 1
当解析器到达'score ='时,它会导致解释器不在本地空间外搜索。
答案 2 :(得分:1)
会发生什么,Python会在检查全局范围之前检查本地范围内的变量。因此,当涉及questions
和answers
时,它们永远不会在本地范围内设置,因此Python会移动到全局范围,在那里找到它们。但是对于score
,Python看到您进行了赋值(score += 1
或score -= 1
)并锁定到本地范围。但是当你在这些语句中提到score
时,它还不存在,所以Python会抛出异常。