Python猜数字游戏输入非数字后触发ValueError报错问题求助
问题排查与修复方案
错误触发原因
- 核心问题1:Python中字符串属于不可变类型,参数传递为值传递,你在
valid_ges函数内部修改的num是局部变量,不会同步修改全局的ges变量。你第一次输入的t一直存在全局ges里,后续哪怕你在函数里输入了合法数字,最后执行ges = int(ges)的时候还是拿最早的t做转换,直接触发ValueError。 - 核心问题2:
valid_ges函数没有写返回值,你调用完校验函数拿不到正确的输入结果,而且你连续调用了两次valid_ges(ges),等于重复跑了两次校验逻辑,这也是运行日志里出现重复输出的原因。 - 核心问题3:校验逻辑顺序完全错误:
elif num != num.isdigit()的判断逻辑不成立,num.isdigit()返回的是布尔值,和字符串num比较永远为真,永远不会走到后面的范围判断分支- 你还没把
num转成整数就判断num > 100,字符串和整数比较会直接报错。
修复后的完整代码
import random def valid_ges(): while True: num = input("猜一个1到100之间的数字:") print("你输入的是:"+str(num)) # 先判断是不是数字 if not num.isdigit(): print("请输入100以内的正整数,不要输入字母,示例:42") continue # 转成整数再判断范围 num = int(num) if num > 100 or num < 1: print("请输入1到100之间的数字") continue # 校验通过返回合法数字 return num # 只调用一次校验函数,直接拿到合法的数字 ges = valid_ges() r = random.randint(1, 100) while ges != r: print(f"你还差{abs(r - ges)}就猜对了") ges = valid_ges() print("恭喜你猜对了!")
改动说明
- 调整校验函数逻辑,不需要传参,直接在函数内部处理输入,校验通过后直接返回合法的整数,不需要外部再做类型转换
- 删掉重复的校验函数调用,避免重复执行逻辑
- 调整判断顺序:先判断是否为数字,转成整数后再判断数值范围,避免类型错误
- 后续猜数字的循环里也复用校验函数,避免用户后续输入非数字内容再次触发报错
内容的提问来源于stack exchange,提问作者BertADawson
相关产品推荐
相关产品推荐

