【问题标题】:Why am I receiving this error message "UnboundLocalError: local variable 'sigma_opt' referenced before assignment"为什么我会收到此错误消息“UnboundLocalError: local variable 'sigma_opt' referenced before assignment”
【发布时间】:2017-08-08 19:19:16
【问题描述】:

我有一个遵循对数正态分布的数据集。如果我在半对数 x 轴上绘制 y 值与 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 仅在少数函数内部定义,但并未在全局范围内定义。 我已经阅读了关于 SO 的其他关于此错误消息的帖子,但没有一个适用于我的案例。 为什么我会收到此错误消息? (我会发布整个代码,但它有 350 多行)

【问题讨论】:

  • pickdist 既不是 2 也不是 3 会发生什么?
  • 我还没有写出升值错误语句。我可以先调试主要部分后这样做。
  • 我明白你没有明白我的意思。当你向这个函数传递不同于 2 或 3 的东西时,你会得到一个UnboundLocalErrorsigma_opt 只在 if/elif 内赋值,所以不满足条件时不赋值
  • 应该正确分配。我可以在一个小时左右看到它,并相应地更新。
  • 不要误会我的意思,但我不在乎 应该被正确分配 - 从代码中可以清楚地看到有未分配的可能路径。就这么简单——没有主观性。

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


【解决方案1】:

您收到此错误的原因是,如果您使用 'pickdist' 属性而不是 2 或 3 调用 'distribGS' 函数,则首先使用 '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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 2013-02-11
    • 1970-01-01
    • 2018-01-22
    • 2019-07-11
    • 2023-02-13
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多