我的计划的目标是让计算机询问用户问题,并返回符合其需求的计算机的一些规格。现在我正在研究QuestionAsker,正如类名所示,它负责向用户提问。我一直挂在AskQuestion()函数的第四行。在我告诉你这个问题之前,先看一下代码:
from question import Question
class QuestionAsker():
questions = [
Question("At minimum, what should your game be running on?", ["Low", "Medium", "Ultra"]),
Question("On a scale of 1-3, how much flair do you want on your computer?", ["Low", "Medium", "Ultra"]),
Question("Money doesn't grow on trees. How much money is in your budget?", ["$500", "$1000", "$2000+"]),
]
index = 0
def AskQuestion(self):
userInputForQuestion = raw_input(self.questions[self.index].question + " ")
if userInputForQuestion not in self.questions[self.index].answers:
print("Try again.")
self.AskQuestion()
self.questions[self.index].selectedAnswer = userInputForQuestion
self.index += 1;
def resetIndex(self):
self.index = 0
def ReadQuestions(self):
pass
我通过调用AskQuestion几次来测试这段代码(循环遍历所有问题),并确保此代码是最顶层的,我提供了多个回答“再试一次”的答案。问题是,如果我提供了一个以上错误答案的问题,但如果我在多个错误答案后正确回答,我会收到以下错误消息:
IndexError: list index out of range
我立即怀疑[self.index]
的{{1}},所以我开始将索引打印到控制台。我认为问题是AskQuestion在AskQuestion函数的最后一行神奇地增加了self.index,但没有。在第一个问题的情况下,它保持打印一致的数字0!
我在这里结束了我的智慧,而我在此看到的其他问题并没有起到太大作用。希望你们能帮忙,谢谢!
答案 0 :(得分:1)
请注意在您的功能体中,当给出错误的答案时,该功能不会结束。它进行递归调用。当该呼叫结束时,索引仍然增加。所以错误的答案仍然使指数变得混乱。
您应该在拨打错误电话后结束该功能,以实现您想要发生的事情。
if userInputForQuestion not in self.questions[self.index].answers:
print("Try again.")
self.AskQuestion()
return None
或使用else
。
if userInputForQuestion not in self.questions[self.index].answers:
print("Try again.")
self.AskQuestion()
else:
self.questions[self.index].selectedAnswer = userInputForQuestion
self.index += 1;
另请注意,以这种方式使用递归并不常见。无论如何,这让你犯了错误。