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

UnboundLocalError问题求助:新手求解决步骤及原理详解

搞定UnboundLocalError:新手友好版详解

嘿,我完全懂你作为编程新手看那些技术帖子一头雾水的感觉,别慌,我来把这个UnboundLocalError的事儿给你掰扯明白,结合你的代码一步步说清楚~

先搞懂:UnboundLocalError到底是什么?

说白了,这个错误就是Python“懵圈”了:它不知道你在函数里用的某个变量,到底是全局变量(就是你代码开头定义的day、v、gas这些函数外的变量),还是函数内部的局部变量(只在函数里生效的变量)。

举个你代码里的常见场景:假设你写了一个函数想推进游戏天数,比如:

def next_day():
    day += 1  # 想把全局的day加1
    print(f"现在是第{day}天")

这时候运行就会报错UnboundLocalError!因为Python看到你在函数里给day赋值(day +=1本质是先读旧值再加,然后赋值回去),就默认day是这个函数的局部变量,但它找遍函数内部,发现赋值前根本没定义过局部的day,就直接报错了。

两种解决方法+原理

方法1:用global声明变量(适合简单场景)

如果你的函数就是要修改外面的全局变量,那就在函数开头告诉Python:“这个变量是全局的,我要改它!”

比如刚才的例子改成:

def next_day():
    global day  # 声明day是全局变量
    day += 1
    print(f"现在是第{day}天")

原理:Python的变量查找规则是「先找局部,再找全局」,用global声明后,Python就会直接去全局作用域找这个变量,不会再把它当成局部变量处理,自然就不会报错了。

针对你代码里的变量,比如要修改gas、water这些,都可以用这个方法:在函数开头加上global gas, water, food(多个变量用逗号分隔)。

方法2:把变量作为参数传入+返回新值(更规范的写法)

如果不想用全局变量(全局变量多了容易搞混,后期维护麻烦),可以把需要修改的变量传给函数,函数处理完后返回新的值,再在外面重新赋值。

比如还是推进天数的例子:

def next_day(current_day):
    new_day = current_day + 1
    print(f"现在是第{new_day}天")
    return new_day  # 返回新的天数

# 调用函数时把全局的day传进去,再把返回值赋值给day
day = next_day(day)

原理:这样函数里的current_day是局部变量,它的值是你传进去的全局day的副本,函数处理完后返回新值,你再把这个新值重新赋给全局的day,既不会混淆变量作用域,也更符合编程的规范。

新手易踩小提醒

如果只是读取全局变量,不用加global声明,比如:

def show_status():
    print(f"当前天数:{day},剩余水量:{water}")  # 只是读全局变量,没问题

但只要你在函数里给这个变量赋值,就必须用上面两种方法之一,否则一定会触发UnboundLocalError!

内容的提问来源于stack exchange,提问作者Fiix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:56:13