local variable XXX referenced before assignment

有关于局部变量在定义之前使用:

base_MSE = train()
index = 0

def add():
    if index>=2:
        para[index]*=1.1
    else:
        para[index]+=1


def sub():
    if index>=2:
        para[index]/=1.1
    else:
        para[index]-=1

def transform():
    # 对某一参数进行变换,有正面效果则尝试
    index = random.randint(0,len(para)-1)
    print('changing index: ', index)
    add()
    new_MSE=train()
    if new_MSE>base_MSE: # MSE增加了  UnboundLocalError: local variable 'base_MSE' referenced before assignment
        sub()
        sub()
        new_MSE=train()
        if new_MSE>base_MSE:
            add()
            new_MSE = base_MSE

    base_MSE = new_MSE # 使用新的MSE进行更新

base_MSE在transform函数外界定义一次,但在transform函数内部又定义一次,python将优先处理在函数体内的变量,且调用在定义之前,所以在new_MSE>base_MSE报错。

相对而言,index变量仅仅在函数内使用了,没有修改,编译器仅会将此变量看做上层作用域的变量。

因此有两种解决方式:

  1. 先赋值后调用,base_MSE不能再作为全局变量
  2. 在函数内部不能进行base_MSE的定义