调用函数时“UnboundLocalError:赋值前引用的局部变量”

时间:2017-06-20 07:11:52

标签: python pandas matplotlib

对于绘图,我根据条件定义颜色(条件是pandas数据帧的某些列中的某些值)。现在我不确定,如果我在定义函数时犯了错误。 功能如下:

def getColour(C, threshold):
    neg = 0 - threshold
    half = threshold/2
    if C <= (neg - half):
        clr = '#2b83ba'
    if ((neg - half) < C <= neg):
        clr = '#abdda4'
    if ((threshold + half) > C >= threshold):
        clr = '#fdae61'
    if (C > (threshold + half)):    
        clr = '#d7191c'
    return clr

这就是我实现它的方法:迭代数据帧的行,然后找到满足条件的列,使用这些列中的索引从列表中获取参数,应用另一个生成结果的函数(此函数有效) ,当我为绘图设置固定颜色时,脚本经过测试并正常工作),然后用不同的颜色绘制结果。

for index, row in Sparse.iterrows():
    lim = row[row.notnull()] 
    ci = [row.index.get_loc(x) for x in lim.index]
    params = np.array(myList)[ci]

    for i, w in enumerate(params):
        w = w.tolist()
        print w, w[2]
        print ci[i]
        colour = getColour(ci[i], threshold)
        x, y = myFunction(w)
        plt.plot(x,y, color=colour,linestyle='-',linewidth=1.5)

但是这会在UnboundLocalError: local variable 'clr' referenced before assignment行上引发错误colour = getColour(ci[i], threshold)

我已阅读其他处理此错误的帖子,但我看不出我的问题是什么。

1 个答案:

答案 0 :(得分:2)

一般来说,巩固你的病情逻辑是一个好主意。 您的clr会拥有所有这些价值吗?不,你可以使用一些elif

def getColour(C, threshold):
    neg = 0 - threshold
    half = threshold/2
    if C <= (neg - half):
        clr = '#2b83ba'
    elif ((neg - half) < C <= neg):
        clr = '#abdda4'
    elif ((threshold + half) > C >= threshold):
        clr = '#fdae61'
    elif (C > (threshold + half)):    
        clr = '#d7191c'
    return clr

那你的病情是否循环?你有if的所有案件吗?如果是,最好在else中抛出错误。如果不是,那就意味着你忘记了一个案例:

def getColour(C, threshold):
    neg = 0 - threshold
    half = threshold/2
    if C <= (neg - half):
        clr = '#2b83ba'
    elif ((neg - half) < C <= neg):
        clr = '#abdda4'
    elif ((threshold + half) > C >= threshold):
        clr = '#fdae61'
    elif (C > (threshold + half)):    
        clr = '#d7191c'
    else:
        raise ValueError('Value expected for clr')
    return clr

编辑:为了回答你的评论,我想你误解了我的意思。在Python中,如果您有意外的事情,最好抛出错误。 所以要么:

  • 您提供的默认颜色值为&#34; White&#34;并且你正常使用它
  • 您返回None,然后其余代码应检查None 读之前的价值(然后可能抛出错误)
  • 您直接抛出错误
  

PEP20:错误不应该以无声方式传递。