Как уже упоминалось @Cixate, это можно исправить, установив correctAnswers = 0
внутри getVerb
и заменив рекурсию циклом while:
def getVerb():
correctAnswers = 0
... the rest of your code, as before ...
... making sure to replace the recursion with a while-loop ...
Проблема в том, что Python фактически видит две разные переменные в двух разных областях: с тем же именем из correctAnswer
. Это вызывает то, что называется "затенением".
Из-за этого Python будет использовать getVerb
версию correctAnswers
только внутри getVerb
. И этой переменной никогда не давали значения! Поэтому Python жалуется, что вы пытаетесь использовать его, не назначив его.
Но ... подожди! Разве мы не присвоили значение? Ну, мы присвоили переменную с именем correctAnswers
, но это была другая переменная с другой областью действия.
Проверьте следующие примеры:
x = 3
print "outer 1:", x # prints 3
def y1():
print "in y1:", x # print 3 -- !!
print "outer 2:", x # still prints 3
def y2():
x = 4
print "in y2:", x # prints 4 !!!
print "outer 3:", x # prints 3 ????
def y3():
print "in y3:", x # raises an exception!
x = 5
print "outer 4:", x # prints 3
y1()
y2()
print "outer 5:", x # still prints 3 !!!
try:
y3()
except:
print "y3 doesn't work!"
Итак, подведем итог сумасшествию:
y1
видит x
из внешней области видимости - объявлено в первой строке
y2
создает свой собственный x
- и не может видеть или использовать другой
- не имеет значения, что
y2
присвоило новое значение своему собственному x
, внешнее x
все еще не изменилось - см. outer 3
и outer 5
y3
также создает свой собственный x
- но пытается использовать его, прежде чем он приобретет значение -> сбой и запись !!
После внесения этого изменения ваша программа заработает. Хотя в этом нет необходимости, вы, возможно, захотите улучшить качество своего кода и научиться писать более идиоматический код на Python. Например:
- заменить рекурсию циклом while
- использовать словари
- используйте
raw_input
вместо input
Но это произойдет со временем и опытом, если вы продолжите в том же духе!