Python while循环条件为False时仍重复输出旧数据问题
问题产生根源
这个bug是递归调用+局部变量不共享+外层循环未正常退出共同导致的,执行逻辑拆解如下:
- 你的代码中,
schleife函数的while循环内,猜错时会调用usrinput,而usrinput又会调用新的schleife函数,属于函数递归调用。每一层schleife的入参usrinputnumber都是独立的局部变量,内层函数传入的新猜测值,不会修改外层函数里存储的旧猜测值。 - 当你在深层递归中输入正确答案时,深层的
schleife会打印恭喜信息然后逐层返回,回到之前所有挂起的外层schleife的调用点。 - 外层
schleife的while循环恢复执行后,会用自己存储的旧的、错误的猜测值重新判断循环条件,条件依然成立,就会再次进入分支打印旧的提示信息,这就是你看到的重复输出问题。如果输入错误次数足够多,递归调用栈堆得太深还会触发栈溢出报错。
你把while换成if之后程序看起来正常,只是因为if分支只会执行一次,递归返回后不会重新判断条件触发打印,但本质还是递归结构,没有解决根本问题。
保留函数拆分写法的正确实现
只要把两个函数的职责拆清楚,避免递归即可:
usrinput只负责读取用户输入、返回输入的整数值,不要在里面调用判断逻辑函数schleife自己维护循环逻辑,猜错时调用usrinput获取新的猜测值,更新变量后进入下一轮判断,不需要嵌套调用自身
修复后的可运行代码:
import random as r secretcode = r.randint(1, 100) print("\n\n\nWelcome to the lottery!\n") print("Guess a number from 1 to 100!") print(secretcode) def usrinput(): usrinputnumber = int(input("Your number: ")) return usrinputnumber def schleife(): current_guess = usrinput() while secretcode != current_guess: if current_guess > secretcode: print("Awh damn! Your number is too high!!") else: print("Unlucky! Your number is too low!") current_guess = usrinput() print("Congratz! You guessed the number!!") schleife()
内容的提问来源于stack exchange,提问作者eyyyflo
相关产品推荐
相关产品推荐

