You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在函数中重新赋值变量?猜数字游戏范围更新问题求解

嘿,我一眼就揪出问题所在啦——你在less()函数里尝试修改high变量,但因为变量作用域的坑,函数里的修改根本没影响到全局的high!咱们一步步把它修好:

问题拆解

  1. 你把high初始化成了字符串str(100),后面每次计算都要转整数,既麻烦又容易出bug;
  2. less()函数里的new_high是局部变量,和外面全局的high完全是两个独立的东西,而且你写的return high == new_high只是做了个比较,根本没完成赋值操作;
  3. 还没处理用户输入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:14:04