为什么有些Python变量保持全局性,而有些则需要定义为全局性



我很难理解为什么有些变量是局部的,有些是全局的。例如,当我尝试这个时:

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似乎不一致。这与我使用列表作为其他变量有关吗?为什么?

(还有,第一次海报;非常感谢我在不需要提问的情况下发现的所有帮助。)

这是因为您正在分配给scorequestionsanswers变量仅被读取,而未写入。

当您分配给变量时,该名称具有您所在的当前方法、类等的作用域。当您尝试获取变量的值时,它首先尝试当前作用域,然后尝试外部作用域,直到找到匹配项。

如果您认为全局是一个语法分析器指令,那么这完全有意义

当你进行时

score += 1 

被翻译成

score = score + 1

当解析器达到"score="时,它会导致解释器不在本地空间之外进行搜索。

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

实际情况是,Python在检查全局作用域之前,将在本地作用域中检查变量。因此,当涉及到questionsanswers时,它们从未在本地范围中设置,因此Python转到全局范围,在那里可以找到它们。但是对于score,Python看到您进行了一个赋值(score += 1score -= 1)并锁定到本地作用域。但是当您在这些语句中提到score时,它还不存在,所以Python抛出了一个异常。

相关内容

  • 没有找到相关文章

最新更新