UnboundLocalError:局部变量' len'在分配之前引用

时间:2015-04-15 03:50:57

标签: python-2.7

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()

此脚本的目的:是询问用户数字,然后让脚本找到数字的平均值并显示它。我创建了一个名为values的空列表,我将用户输入数字转换为整数后附加。

我一直收到UnboundLocalError:本地变量' len'在赋值之前引用...甚至认为我确实将len和sum分配给列表中元素的长度和总和。

P.S。我是python的新手,通常当我收到错误时,我会尝试自己解决它或研究它但是对于这个我真的不明白为什么我得到这个错误......任何见解都会受到赞赏!!

2 个答案:

答案 0 :(得分:4)

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

您可能想要为变量和函数使用相同的名称:

>>> 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

要解决此问题,请将您的功能更改为:

def calculating_average():
    xlen = len(values)
    xsum = sum(values)
    final = xsum / xlen 
    print final

作为最后一点,我看到另外两个潜在的问题。第一个是如果你没有输入数字你会得到的除零误差(即立即输入done)。

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

答案 1 :(得分:2)

使用全局函数的相同名称创建局部变量时会发生此问题。 Python假定有一个名为len的局部变量会覆盖len内置函数。

要解决此问题,您应该在创建len变量之前添加行global len(以及global sum)。

有关Global vs Local Variables的更多信息,请访问: http://www.python-course.eu/global_vs_local_variables.php

但是,您不应将变量命名为内置函数len。