我想问一谈将数字相加的问题。所以这是我的代码的一部分,但是我的任务是用户首先需要选择一种报告类型,然后他们需要输入某些值。因此,在用户输入报告之后,代码将继续提示输入值。只要输入值是一个数字,我希望我的数字继续加起来。但是,当我尝试将输入永久性地添加到总计中时,它会显示
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()
答案 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
块进行比较。
integer
该用户一直输入,直到他们输入单词 quit 为止。在这种情况下,您希望查看之前输入的所有integer
的总和。