为什么我收到此错误消息“UnboundLocalError:局部变量'sigma_opt'在分配之前被引用”

时间:2017-03-17 09:42:55

标签: function python-3.x error-handling functional-programming

我有一个遵循对数正态分布的数据集。如果我将y值与semilog-x轴上的x值进行绘制,则分布将显示为高斯分布。类似地,如果我对数据集中每个值的对数进行排序并将它们映射到log(x)的域,则分布将显示为高斯(但由于域上的log(x)值的线性间距更宽,因此更好)。我的代码试图通过优化参数mu和sigma来最小化上述三种表示中数据集的卡方(因为对数正态分布的平均值不等于正态分布的平均值)。我的问题不是卡方最小化(适用于这些表示的2/3),而是我的代码的一个特定部分的语法。

为了简化代码,我使用函数参数pickdist来表示正在处理哪个分发。在下面的代码中,2表示y vs semilog(x)表示,3表示y vs log(x)表示,optpar2optpar3是先前计算的参数来自代码(未示出)并表示分布的mu和sigma的优化值。

def distribGS(pickdist, x):
    if pickdist == 2:
        mu_opt, sigma_opt = optpar2
    elif pickdist == 3:
        mu_opt, sigma_opt = optpar3
    cnorm = 1/ ( sigma_opt * (2 * pi)**(1/2) )
    return [(( cnorm * exp( (-1) * (x[index] - mu_opt)**2 / ( 2 * (sigma_opt **2) ) ) )) for index in range(len(x))]

这种代码尝试的原因是将这种数据拟合映射到实际数据的(标准化)直方图。但是,当我运行以下代码时出现错误:

UnboundLocalError: local variable 'sigma_opt' referenced before assignment

我发现这很奇怪,因为sigma_opt仅在少数函数内定义,但未在全局定义。 我已经阅读了有关此错误消息的其他帖子,但没有一个适用于我的情况。为什么我收到此错误消息? (我会发布整个代码,但它是350多行)

1 个答案:

答案 0 :(得分:1)

您收到此错误的原因是因为如果您使用'pickdist'属性调用'distribGS'函数不同于2或3'sigma_opt'变量,则首先使用而不进行赋值。

您可以做的是将函数开头的'sigma_opt'变量赋值为某个默认值,或使用'else'语句为其指定默认值。 例如

def distribGS(pickdist, x):
    mu_opt, sigma_opt = 0
    if pickdist == 2:
        mu_opt, sigma_opt = optpar2
    elif pickdist == 3:
        mu_opt, sigma_opt = optpar3
    cnorm = 1/ ( sigma_opt * (2 * pi)**(1/2) )
    return [(( cnorm * exp( (-1) * (x[index] - mu_opt)**2 / ( 2 * (sigma_opt **2) ) ) )) for index in range(len(x))