无法永远循环加总

时间:2018-10-20 05:38:06

标签: python python-3.x

我想问一谈将数字相加的问题。所以这是我的代码的一部分,但是我的任务是用户首先需要选择一种报告类型,然后他们需要输入某些值。因此,在用户输入报告之后,代码将继续提示输入值。只要输入值是一个数字,我希望我的数字继续加起来。但是,当我尝试将输入永久性地添加到总计中时,它会显示

UnboundLocalError: local variable 'total' referenced before assignment

我希望能够打印出用户输入“ quit”后添加的总输入。

total = 0

def adding_report():
    while True:
        report_type = input("Choose a report type(a or t): ")
        while report_type == "t":
            value_input = input("Put in a value: ")
            if value_input.isdigit() == True:
                total += int(value_input)
            elif value_input == "quit":
                print(total)
            else:
                print("invalid")

 adding_report()

2 个答案:

答案 0 :(得分:1)

您在函数外部定义的total变量是全局变量。默认情况下,您不能为函数内部的全局变量赋值。相反,Python会将您在函数中分配的任何变量都假定为局部变量。

您可以通过使用total语句(global)告诉编译器您希望其访问名为global total的全局变量,而不是该名称的局部变量。有了该语句后,您的total += int(value_input)赋值语句将修改全局变量total,并且不会收到有关未绑定局部变量的错误(因为全局变量已初始化为零)。 / p>

另一种解决方案是放弃全局变量,而是在向函数添加内容之前在函数内部初始化名为total的局部变量。我不确定我是否理解两个循环的工作方式,但是您可能希望将total = 0行移动到函数的顶部或外部循环的顶部。在某些情况下,这样做可能会更好,因为局部变量的访问速度更快,而且它们不会污染模块的全局名称空间。

答案 1 :(得分:0)

我将修改您的功能,如下所示:

def adding_report():
    total = 0
    report_type = input("Choose a report type(a or t): ")
    while report_type == "t":
        value_input = input("Put in a value: ")
        if value_input.isdigit():
            total += int(value_input)
        elif value_input == "quit":
            print( '-'*40)
            print('Total: {}'.format(total))
            print( '#'*16, 'ENDED', '#'*16)
            break
        else:
            print('Current Total: {}'.format(total))
            print('Invalid value entered. Enter an integer or type "quit" to leave.')

adding_report()

由于变量UnboundLocalError: local variable 'total' referenced before assignment未在函数中定义,因此您将获得total。您可能希望将total设为global variable (global total),即使在修复UnboundLocalError之后,您仍然需要至少一个中断来停止无限循环。 while True永远是正确的,您需要突破它。但是您还需要设置条件以突破内循环。

在我所附的代码段中,我删除了一条while语句,并且正在使用if块进行比较。

注意:

我写此答案的前提是,如果用户选择 t ,则希望继续添加integer该用户一直输入,直到他们输入单词 quit 为止。在这种情况下,您希望查看之前输入的所有integer的总和。