python - 返回时出现 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
一段时间也不起作用。
我不知道还能做什么。任何帮助将不胜感激。(非常抱歉,如果这类似于其他帖子,即看起来像重复)
解决方案
我终于找到了问题所在。您需要使用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
对象)
推荐阅读
- python - 我该如何解决?规范错误:不支持嵌套重命名器
- c++ - 为什么仅仅调用一个对象会做某事?
- utf-8 - 无法在 windows server 2016 中设置使用 Unicode Utf-8?
- python - Python函数代码修改以从用户输入中取整值
- c - 如何在不知道 ip 的情况下从 udp 连接设置多播?
- php - 将 WooCommerce 预订日期和时间添加到管理订单预览
- docker - Docker-compose,Swag 错误:“您的 DockerHost 很可能运行的是过时版本的 libseccomp”
- scheme - 在不使用成员的情况下检查 Racket 中的项目是否在列表中
- python - 我的 python youtube 视频下载器有问题
- pytorch - 通过 torch.utils.tensorboard add_graph 可视化对象检测网络的图