首页 > 解决方案 > 返回时出现 UnboundLocalError

问题描述

这是线性曲线拟合的简单代码。

def cf(x, y):
    a0 = 0
    a1 = 0
    if (len(x) == len(y)) and (len(x) > 3):
        s_x = 0
        s_y = 0
        s_xsq = 0
        s_xy = 0
        i = 0
        while i < len(x):
            s_x += x[i]  
            s_y += y[i]
            s_xsq += x[i] ** 2
            s_xy += x[i] * y[i]
            i += 1
        a0 = (s_xsq * s_y - s_x * s_xy) / (len(x) * s_xsq - s_x ** 2)
        a1 = (len(x) * s_xy - s_x * s_y) / (len(x) * s_xsq - s_x ** 2)
    return a0, a1

xx = list(input("Enter x variables:"))
yy = list(input("Enter y variables:"))
m, c = cf(xx, yy)
print(m, c) 

它编译(或者更确切地说,解释)没有任何问题,但是当我输入 and 的值时xx=[4,5,6,7]yy=[10,12,14,16]它显示UnboundLocalError:a0 is referenced before assignment.

我在这里(以及在其他一些网站上)阅读了很多关于此的帖子,其中在大多数情况下,变量都是在 之外声明的def,而这里不是这种情况。我还看到了一个与我类似的案例,变量在 while 循环内声明,建议是在 while 外声明变量。我试过了,但错误没有解决。我还尝试在外部声明 a0 和 a1 ,def但这完全停止了代码运行。

搁置return一段时间也不起作用。

我不知道还能做什么。任何帮助将不胜感激。(非常抱歉,如果这类似于其他帖子,即看起来像重复)

标签: python

解决方案


我终于找到了问题所在。您需要使用eval语句代替list.

假设这不会被利用,

更改list(input("Enter x variables: "))eval(input("Enter x variables: "))

做同样的事情y

list列出用户输入中的每个字符。eval,在这种情况下,解析数字列表。

print在将列表传递给函数之前尝试ing 列表。

如果您不想使用eval,请让用户知道input列表的长度。然后,使用for循环输入每个值,一次一个。

像这样:

xx = []
length = int(input("Enter length of xx: "))
for i in range(length):
    xx.append(int(input(f"Enter xx[{i}]: ")))

另一种(更复杂的)方法可以做到这一点,您可能会发现它很有用:

xx = list(map(lambda x: int(x), input("Enter x variables: ").split(" ")))

这会将输入字符串拆分为数字字符串列表。该map函数将该列表的每个元素转换为整数。然后将最终结果转换回列表(map()返回一个map对象)


推荐阅读