Python石头剪刀布代码报UnboundLocalError: 'last_move'未赋值引用
报错根因定位
UnboundLocalError: local variable 'last_move' referenced before assignment不存在单点修复方案,是三层代码逻辑漏洞共同触发的,需要逐一对以下问题修正:
- 跨函数隐式引用变量:
last_move原本是move函数的局部变量,但独立的全局函数beat_prediction内部直接调用了这个变量。根据Python的作用域规则,函数内出现的、没有通过参数传入也没有全局声明的变量,会被识别为当前函数的局部变量;由于beat_prediction从始至终没有给这个变量赋值,访问时就会触发“未绑定就引用”的报错。 - 分支执行路径变量缺失:
move函数在开局分支(双方历史记录为空、第一手对战)只给my_move赋值,完全没有初始化last_move,但分支末尾的return my_move, last_move硬要求返回这个变量,在该执行路径下last_move根本不存在,同样会触发同类报错。 - 隐藏的导入缺失:代码中使用了
random.choice但从未导入random模块,修复完变量绑定问题后会直接触发NameError,属于连带的隐藏bug。
可直接运行的修复代码
修复过程完全保留你设计的FakeOut核心判断逻辑,只调整变量传递、初始化和导入问题,不改动原有对战规则的设计,不会影响你原本的策略效果:
import random strategy_name = 'FakeOut' def move(my_history, their_history): # 提前初始化last_move,覆盖所有分支的返回要求 last_move = '' if len(their_history)==0 and len(my_history)==0: my_move = 'r' # 第一手的出拳存入last_move,匹配后续的参数逻辑 last_move = my_move else: prediction = predict_they_will_repeat(their_history.lower()) last_move = my_last_move(my_history.lower()) # 显式把last_move作为参数传给目标函数 my_move = beat_prediction(prediction, last_move) return my_move, last_move def predict_they_will_repeat(their_history): return their_history[-1] def my_last_move(my_history): return my_history[-1] # 函数入参增加last_move,消除无来源的变量引用 def beat_prediction(prediction, last_move): if prediction =='r' and last_move == 'p': winning_move = 'r' elif prediction == 'p' and last_move == 's': winning_move = 'p' elif prediction == 's' and last_move == 'r': winning_move = 's' elif prediction == 'r' and last_move != 'p': winning_move = random.choice(["r", "p", "s"]) elif prediction == 'p' and last_move != 's': winning_move = random.choice(["r", "p", "s"]) elif prediction == 's' and last_move != 'r': winning_move = random.choice(["r", "p", "s"]) else: winning_move = '' print ('Error in beat_prediction(): prediction was not r, p, or s.') return winning_move
修复后的校验要点
- 所有执行路径下
last_move都被提前初始化,不会出现未赋值就引用的情况 beat_prediction的所有变量都来自函数入参,不依赖跨作用域的隐式引用- 缺失的
random模块导入已补上,随机选招的逻辑可以正常运行
内容的提问来源于stack exchange,提问作者Rebekah Bledsoe
相关产品推荐
相关产品推荐

