You need to enable JavaScript to run this app. Python石头剪刀布代码报UnboundLocalError: 'last_move'未赋值引用
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 02:06:06