如何在函数中重新赋值变量?猜数字游戏范围更新问题求解
嘿,我一眼就揪出问题所在啦——你在less()函数里尝试修改high变量,但因为变量作用域的坑,函数里的修改根本没影响到全局的high!咱们一步步把它修好:
问题拆解
- 你把
high初始化成了字符串str(100),后面每次计算都要转整数,既麻烦又容易出bug; less()函数里的new_high是局部变量,和外面全局的high完全是两个独立的东西,而且你写的return high == new_high只是做了个比较,根本没完成赋值操作;- 还没处理用户输入
more的情况,二分法得同时能调整上下边界才能正常缩小范围呀!
修复后的完整代码
我给你调整了代码逻辑,用更直观的方式处理边界更新,同时补上了more的分支逻辑:
print("Guess a number between 1 and 100") low = 1 high = 100 # 直接设为整数,避免反复类型转换 guess_count = 0 # 变量名更清晰,避免和猜测的数字混淆 def get_mid(low, high): # 用整数除法,避免得到50.5这类浮点数,符合猜整数的需求 return (low + high) // 2 # 二分法猜1-100最多需要7次(2^7=128 > 100),循环7次足够覆盖所有情况 while guess_count < 7: current_guess = get_mid(low, high) response = input(f"Is your number [less] than, [more] than, or [equal] to {current_guess}? ") if response == "equal": print(f"It took {guess_count + 1} guesses to guess the number.") break elif response == "less": high = current_guess # 直接更新上边界,缩小范围 guess_count += 1 elif response == "more": low = current_guess + 1 # 下边界+1,避免重复猜测同一个数 guess_count += 1 else: # 理论上走不到这里,因为7次足够覆盖1-100所有数字 print("Wait, did you cheat? 😜")
关键修改说明
- 解决作用域问题:直接在主循环里更新
low和high,不用在函数里绕弯子(如果一定要用函数,记得要么用global声明全局变量,要么让函数返回新的边界值并赋值); - 优化边界调整:当用户说数字更大时,下边界设为
current_guess + 1,因为已经确定数字比当前猜测大,无需再包含当前数; - 变量名更清晰:把
guess改成guess_count,避免和猜测的数字混淆,可读性更强。
你试试这个代码,输入less或more时,范围会正确缩小,很快就能精准猜到数字啦!
内容的提问来源于stack exchange,提问作者B Lab
相关产品推荐
相关产品推荐

