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

Python文本游戏调用嵌套函数报UnboundLocalError如何解决

报错原因

你遇到的UnboundLocalError是Python变量作用域规则导致的:你在嵌套的look()函数内对room做赋值操作时,Python会默认将room识别为look()的局部变量,但是你赋值语句room = [room]右侧先读取了room的值,此时局部变量room还没完成定义,就会抛出这个错误。
你之前加global不生效的原因有两个:一是如果你的room、p_choice、room_desc变量不是定义在模块最顶层的全局作用域,global关键字无法识别;二是你没有同时声明所有跨作用域访问的变量,也会出现读取失败的问题。

修复方案

推荐方案:参数传递+返回值(避免全局变量混乱)

直接把通用操作需要的变量作为参数传入,需要修改的变量通过返回值传回主逻辑,完全不需要碰作用域声明,逻辑更清晰也更容易维护:
首先调整公共函数的定义:

# 不需要嵌套函数,直接处理所有通用操作即可,后续加背包、查看物品之类的功能都可以往里面加
def handle_common_actions(p_choice, room_desc, current_room):
    if p_choice == 'look':
        print(room_desc)
        # 查看描述不需要修改房间,直接返回原房间值即可
        return current_room
    # 后续其他通用操作可以在这里扩展
    # 比如if p_choice == 'inventory': 打印背包内容 return current_room
    return current_room

然后修改主循环里的调用逻辑:

else:
    # 接收函数返回的room值更新当前房间
    room = handle_common_actions(p_choice, room_desc, room)

兼容你现有写法的方案:作用域声明

如果你不想改现有嵌套函数的结构,且你的room、p_choice、room_desc都是顶层全局变量,需要在所有用到这些变量的函数内提前声明:

def all_rooms():
    # 先声明外层函数要用到的所有全局变量
    global p_choice, room_desc, room
    def look():
        # 嵌套函数也要声明用到的全局变量
        global p_choice, room_desc, room
        if p_choice == 'look':
            print(room_desc)
            room = [room]
    look()

该方案不推荐,后续房间和功能变多后全局变量会非常难维护,容易出现更多隐式bug。

额外优化提示

你当前每个房间单独写while循环的写法后续房间数量增加后会非常冗余,可以把所有房间的配置(可用移动方向、房间描述、房间内物品)统一存在一个全局字典里,主循环只需要读取对应房间的配置即可,不需要为每个房间重复写判断逻辑,复用度会高很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:57:01