Python测验程序错误猜测次数始终显示0的原因排查
错误次数始终为0的原因及修复方案
核心原因
Python中整数属于不可变数据类型,函数参数传递时是按值传递(传递的是变量的副本)。你在new_game里定义的wrong_guess是整数,当把它传给check_answer函数时,函数内部拿到的只是它的一个副本,而非原变量本身。在check_answer里执行wrong_guess += 1,只是修改了这个局部副本的值,完全不会影响new_game函数中原来的wrong_guess变量,所以外部打印时始终显示初始值0。
修复方案
方案1:让函数返回正确标记和错误增量(推荐)
修改check_answer函数,同时返回是否答对的标记和错误次数的增量,在new_game中分别更新两个统计值:
def new_game(): wrong_guess = 0 correct_guess = 0 question_num = 1 print("10-Question Automated Quiz") print("Developed by: Wesly Farillon") for key in questions: print("-------------------------------------------------") print("Question:", key) print("\nChoices:") for i in answers[question_num - 1]: print(i) guess = input("\nType your Answer here: ") guess = guess.upper() # 接收返回的正确增量和错误增量 correct_add, wrong_add = check_answer(questions.get(key), guess) correct_guess += correct_add wrong_guess += wrong_add question_num += 1 print("Score: ", correct_guess) print("Wrong: ", wrong_guess) def check_answer(answer, guess): if answer == guess: return 1, 0 else: return 0, 1
方案2:用可变类型包裹错误次数
利用列表这种可变类型的特性,修改列表内部元素会影响外部变量:
def new_game(): wrong_guess = [0] # 用列表包裹整数,变成可变类型 correct_guess = 0 question_num = 1 print("10-Question Automated Quiz") print("Developed by: Wesly Farillon") for key in questions: print("-------------------------------------------------") print("Question:", key) print("\nChoices:") for i in answers[question_num - 1]: print(i) guess = input("\nType your Answer here: ") guess = guess.upper() correct_guess += check_answer(questions.get(key), guess, wrong_guess) question_num += 1 print("Score: ", correct_guess) print("Wrong: ", wrong_guess[0]) # 读取列表第一个元素 def check_answer(answer, guess, wrong_guess): if answer == guess: return 1 else: wrong_guess[0] += 1 # 修改列表内部元素 return 0
方案3:使用全局变量(不推荐)
虽然可以实现,但会破坏代码的模块化,不建议在复杂程序中使用:
wrong_guess = 0 # 定义全局变量 def new_game(): global wrong_guess # 声明使用全局变量 wrong_guess = 0 correct_guess = 0 question_num = 1 print("10-Question Automated Quiz") print("Developed by: Wesly Farillon") for key in questions: print("-------------------------------------------------") print("Question:", key) print("\nChoices:") for i in answers[question_num - 1]: print(i) guess = input("\nType your Answer here: ") guess = guess.upper() correct_guess += check_answer(questions.get(key), guess) question_num += 1 print("Score: ", correct_guess) print("Wrong: ", wrong_guess) def check_answer(answer, guess): global wrong_guess if answer == guess: return 1 else: wrong_guess += 1 return 0
内容的提问来源于stack exchange,提问作者RVN
相关产品推荐
相关产品推荐

