Ошибка возникает из-за проблемы в вашей рекурсивности. Ниже я попытаюсь объяснить проблему в вашей рекурсии. Предположим, это ваш ввод в терминал с вашим текущим кодом:
wordChoice()
Затем интерпретатор Python оценивает выражение, выполняя код в блоке def wordChoice()
. Все будет работать гладко, пока ваш if
блок Ваш текущий if block is like this
:
if word in usedWords:
print("gotta pick another word") ### DELETE LATER
wordChoice() # Python must evaluate this before continuing
Когда ваш word
используется, Python доберется до этого нового wordChoice()
и оценит это выражение , прежде чем продолжить . Предположим, что при запуске этой второй wordChoice()
рандомизированная word
не используется, и код достигает вашего блока else
.
else:
usedWords.append(word)
accusative = nom_acc[word]
Здесь тоже нет проблем, все гладко, будет return word, accusative
, как вы и хотели. Этот оператор return
сообщает Python, как он должен оценивать последний вызванный wordChoice()
. Это означает, что он вернется с того места, где остановился в последний раз, когда был вызван wordChoice()
, то есть это утверждение if
. Так будет и дальше:
if word in usedWords:
print("gotta pick another word") ### DELETE LATER
some_word, some_accusative_value # the interpreter will continue the code from this point
else:
usedWords.append(word)
accusative = nom_acc[word]
return word, accusative
Это означает, что блок if
выполнен и он снова перейдет к return word, accusative
, но в рамках этого текущего wordChoice()
они не установлены, поскольку этот wordChoice()
не дошел до else
заявление. Чтобы исправить свою рекурсивность, вы должны return wordChoice()
, пока код не выполнится, выполнить оператор else
. Ниже приведено правильное решение для того, что вы хотите:
nom_acc = {"qeso":"qes", "os":"os", "sondra":"sondre", "mawizzi":"mawizze", "khewo":"khewe", "alegra":"alegre", "kendra":"kendre", "zhalia":"zhalie", "achrakh":"achrakh", "ador":"ador", "hoggi":"hogge", "soqwi":"soqwe"}
usedWords = []
def wordChoice():
global usedWords
print(usedWords) ### DELETE LATER
word = random.choice(list(nom_acc)) ### randomly pick a key from a dictionary (which is the nominative form)
print(word) ### DELETE LATER
if word in usedWords:
print("gotta pick another word") ### DELETE LATER
return wordChoice() # return correct recursive result
else:
usedWords.append(word)
accusative = nom_acc[word]
return word, accusative # This return statement should be inside the else statement for clearness