Python代码提示已提前定义的变量Meds未定义报错原因咨询
问题原因
你遇到的报错本质是Python的变量作用域规则导致的:
- 在函数内部定义、没有加特殊声明的变量默认是局部变量,仅在当前函数的执行周期内生效,函数执行结束后变量就会被销毁,其他函数无法直接访问。
- 你在
store()函数内部定义的Meds属于store()的局部变量,game()函数属于完全独立的作用域,自然无法识别这个变量。
不光是Meds,你在store()里定义的Blankets、Tires、Gun等变量,如果后续要在game()里调用,都会触发同类未定义报错。
可行的解决方法
方法1:使用全局变量(适合小型游戏快速修改)
- 在最开头的全局变量声明区,提前定义所有需要跨函数共享的变量,添加初始值:
#Vals money = 700 Gun1 = 0 MilesLeft = 20 # 新增共享变量初始值 Meds = 0 Blankets = 0 Tires = 0 Gun = 0
- 在
store()函数开头加global声明,告诉Python你接下来要修改的是全局变量,不是新建局部变量:
def store(): global money, Meds, Blankets, Tires, Gun # 后面原有代码不变
方法2:用字典统一管理游戏状态(更规范,不易出bug)
把所有游戏相关的状态都存在同一个可变字典里,函数之间共享这个字典即可,不需要额外声明global:
# 开头统一管理状态 game_state = { "money": 700, "gun": 0, "miles_left": 20, "meds": 0, "blankets": 0, "tires": 0 } # 后续所有函数里操作字典里的键即可,比如store里买Meds的部分: many3 = int(input("Amount: ")) game_state["meds"] += many3 # game里判断的时候写: if game_state["meds"] < 1: print("Oh no! You Died!")
其他需要修正的代码问题
game()函数里的value = randint(1, 1)永远只会返回1,永远触发不了value == 2的新冠事件分支,需要改成value = randint(1, 2)store()函数中用户选择不买枪的分支里,money - j是无效表达式,没有赋值效果,你应该是想写money = j- 现在
game()用递归调用自身的方式循环,运行次数多了会触发栈溢出报错,建议改成while循环实现游戏主逻辑
内容的提问来源于stack exchange,提问作者CoinHawkng
相关产品推荐
相关产品推荐

