gpt4 book ai didi

python - 未绑定(bind)本地错误: local variable 'len' referenced before assignment

转载 作者:行者123 更新时间:2023-12-02 00:37:26 25 4
gpt4 key购买 nike

print "welcome to the average finder"
print """Insert the values you want to find the average for,
when you insert all the values type 'done'"""

values = []

def insert_values():
action = raw_input("> ")

if 'done' in action :
calculating_average()
elif action != 'done':
x = int(action)
values.append(x)
insert_values()
else:
print "please insert values then type done"
insert_values()

def calculating_average():

len = len(values)
sum = sum(values)

final = sum / len
print final

insert_values()

该脚本的目的:向用户询问数字,然后让脚本求出数字的平均值并显示出来。我创建了一个名为值的空列表,将用户输入的数字转换为整数后附加它们。

我不断收到 UnboundLocalError:赋值前引用的局部变量“len”...即使我认为我确实将 len 和 sum 分配给了列表中元素的长度和总和。

附注我是Python新手,通常当我遇到错误时,我会尝试自己修复它或研究它,但对于这个我真的不明白为什么我会收到这个错误......任何见解将不胜感激!!

最佳答案

关于您的代码:

len = len(values)
sum = sum(values)

您可能不想对变量和函数使用相同的名称(1):

>>> x = [1,2,3]

>>> len(x)
3

>>> len = len(x)
>>> len
3

>>> len(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

在您的例子中,错误消息UnboundLocalError:赋值前引用的局部变量'len'很有趣,但这是由于特定的Python功能所致。

除非函数内的变量被标记为全局,否则在函数内任何地方重新绑定(bind)它都会导致它在任何地方都被视为局部变量> 在该函数中,甚至在重新绑定(bind)点之前。

因此,len = len(something) 导致 len 被归类为局部变量,因此您尝试使用它(通过将其作为函数调用)在设置之前。

要解决该问题,请将您的函数更改为:

def calculating_average():
value_len = len(values)
value_sum = sum(values)
final = value_sum / value_len
print final
<小时/>

最后一点,我还发现了另外两个潜在的问题。第一个是如果您不输入数字(即立即输入 done),您将得到除零错误。

第二个是……不寻常的……使用递归来返回并获取下一个数字。我会认真考虑重构您的代码,以便通过循环完成此操作。

<小时/>

(1) 在某些时候,每个 Python 开发人员都会顿悟“名称/对象区别”。

我的意思是,Python 中的每个对象本质上都是“未命名的”,我们以各种方式绑定(bind)到它们。当从对象中删除最后一个绑定(bind)时,该对象将变得不可访问,因此需要进行处置(垃圾收集)。例如代码:

a = [1, 2, 3]
b = a

创建两个名称,但只创建一个对象,这意味着a[1] = 42将影响ab “名称”,因为同一个对象被两者绑定(bind):

  a   b
\ /
V
[1, 42, 3]

就是导致 len = len(x) 等语句出现问题的原因。

在执行之前,len 名称会绑定(bind)到一个函数,该函数执行您所期望的操作,计算出某个对象的长度。执行后,它绑定(bind)到该函数返回的值。

此时,执行 something = len(something_else)something = 3(something_else) 没有什么不同。

还要注意,这种意义上的“绑定(bind)”是模式,而不仅仅是像 name = some_object 这样的名称绑定(bind)。它还包括“匿名”绑定(bind),例如 my_list.append(42) - 列表中的每个条目都是到该位置的对象的绑定(bind)(在本例中为 my_list[-1] 绑定(bind)到对象 42)。

关于python - 未绑定(bind)本地错误: local variable 'len' referenced before assignment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29641283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com