Python函数内修改全局变量 结合输入与if语句报错排查
问题定位
你触发的固定报错为UnboundLocalError: local variable 'xxx' referenced before assignment,根源是Python作用域规则,叠加几处语法、逻辑错误,具体问题如下:
- 核心作用域问题:在函数内部对全局变量
m/AH/ndays做赋值修改时,没有提前声明全局变量引用。Python只要检测到函数内存在对某个变量的赋值操作,就会默认将该变量判定为函数局部变量,不会向上查找全局作用域的同名变量,此时在赋值语句前读取这个“局部变量”就会触发报错,这也是调整代码时报错位置来回变化的原因。 - 语法错误:print语句中混用了中文全角引号,存在未加引号的裸文本,且变量名大小写不匹配(全局定义的是
Day_Count,print中写的是Day_count),就算解决作用域问题,运行到print语句也会直接报错。 - 逻辑错误:
- 输入判断仅匹配小写
y,用户输入大写Y时习惯计数直接失效 Day_Count在全局初始化时就固定为初始值,不会随天数增加自动更新- 全局变量
m是单次习惯完成度的计数,原代码每次调用函数时没有将m重置为0,多次调用会累加历史m值,导致后续的分支判断完全失效
- 输入判断仅匹配小写
修正后可运行代码
m = 0.0 AH = 1.0 ndays = 0.0 def AtomicHabits(): # 声明需要修改的全局变量 global m, AH, ndays # 输入自动去空格、转小写,兼容大写Y、带空格输入的场景 wo = input("Did you work out? Y/N? ").strip().lower() tr = input("Did you study/practice trading? Y/N? ").strip().lower() co = input("Practice coding? Y/N? ").strip().lower() # 每次调用重置单次计数,避免历史值干扰 m = 0 if wo == 'y': m += 1 if tr == 'y': m += 1 if co == 'y': m += 1 if m == 3: m = .01 elif m == 2: m = .0066 elif m == 1: m = .0033 elif m == 0: m = -.01 AH = AH * (1.0 + m) ndays += 1 return AH, m, ndays # 调用函数 AtomicHabits() # 动态生成天数展示文本,替代固定不变的初始化元组 day_show = f"{ndays} day out of 90" # 修正引号、变量名问题 print("Today’s change is ", m*100, "% on ", day_show, ", bringing total improvement to ", AH)
更稳妥的无全局变量写法
全局变量多了很容易出现难排查的逻辑bug,日常开发更推荐用参数传值、返回值承接状态的写法,不需要依赖global声明:
def AtomicHabits(current_ah, current_days): wo = input("Did you work out? Y/N? ").strip().lower() tr = input("Did you study/practice trading? Y/N? ").strip().lower() co = input("Practice coding? Y/N? ").strip().lower() m = 0 if wo == 'y': m += 1 if tr == 'y': m += 1 if co == 'y': m += 1 if m == 3: m = .01 elif m == 2: m = .0066 elif m == 1: m = .0033 elif m == 0: m = -.01 new_ah = current_ah * (1.0 + m) new_days = current_days + 1 return new_ah, m, new_days # 初始化状态 AH = 1.0 ndays = 0 # 调用函数并承接返回的最新状态 AH, m, ndays = AtomicHabits(AH, ndays) day_show = f"{ndays} day out of 90" print("Today’s change is ", m*100, "% on ", day_show, ", bringing total improvement to ", AH)
内容的提问来源于stack exchange,提问作者Kingxae
相关产品推荐
相关产品推荐

