[英]Variable Referenced Before Assignment
我正在学习Python,并尝试编写一个提示计算器作为第一个小项目。
我想出了以下代码:
meal = raw_input("Cost of meal: ")
tax = raw_input("Tax: ")
tip = raw_input("Tip: ")
def tipCalc(meal, tax, tip):
def convertInput(meal, tax, tip):
try:
retMeal = int(meal)
retTax = int(tax)
retTip = int(tip)
except ValueError:
retMeal = float(meal)
retTax = float(tax)
retTip = float(tip)
return retMeal
return retTax
return retTip
convertInput(meal, tax, tip)
retTax = retTax / 100
retTip = retTip / 100
total = retMeal + retTax + retTip
print total
tipCalc(meal, tax, tip)
但是,我收到以下错误:
Traceback (most recent call last):
File "/Users/dustin/Desktop/tipcalc.py", line 27, in <module>
tipCalc(meal, tax, tip)
File "/Users/dustin/Desktop/tipcalc.py", line 22, in tipCalc
retTax = retTax / 100
UnboundLocalError: local variable 'retTax' referenced before assignment
这似乎是一个简单的错误,但我似乎找不到逻辑上的错误。
您可能是这个意思:
def tipCalc(meal, tax, tip):
def convertInput(meal, tax, tip):
try:
retMeal = int(meal)
retTax = int(tax)
retTip = int(tip)
except ValueError:
retMeal = float(meal)
retTax = float(tax)
retTip = float(tip)
return retMeal, retTax, retTip
retMeal, retTax, retTip = convertInput(meal, tax, tip)
retTax = retTax / 100
retTip = retTip / 100
total = retMeal + retTax + retTip
print total
tipCalc(meal, tax, tip)
如果希望从一个类方法返回多个值,则多个return语句不起作用。 您需要有1个return语句,并发送回任意数量的值。
同样,错误是在计算retTax = retTax / 100
,尚未声明变量。
其他答案涵盖了您遇到异常的原因,因此我将跳过该原因。 相反,我想指出一个微妙的错误,迟早会咬你,如果将税或小费输入为整数,会使代码计算错误的值。
重要提示 :这个答案对于Python 2.x是正确的(我看到您正在使用)。 在Python 3.x中,除法的默认行为会更改,并且此答案将不再成立(并且您的代码将正常运行)。
考虑到这一点,让我们看一下Python解释器中的内容。
Python 2.7.4 (default, Apr 19 2013, 18:28:01)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 2.0 / 3.0
0.6666666666666666
>>> 2 / 3
0
在第一个示例中,我们看到将两个浮点数相除会发生什么:我们得到的浮点数与结果可以得到的最佳近似。 (2/3永远不会由浮点数精确表示,但是对于几乎所有目的而言,它都是足够接近的结果)。 但是看第二个例子吗? 而不是0.666 ...,它返回0。为什么呢?
这是因为在Python 2.x中,保证将两个int
划分在一起总是会返回一个int
,因此它会四舍五入(始终向下)到int。 与%
运算符(返回余数)结合使用,您可以进行“年级”除法,其中3乘2乘以7,剩下的1。 这在许多算法中非常有用,因此一直保持下去。 如果要使用浮点除法(得到float
结果),则需要确保除法中至少有一个数字是float
。
因此,如果您想获得0.6666...
结果,则应执行2.0 / 3
或2 / 3.0
。 在您的代码中,您应该执行以下任一操作:
retTax = retTax / 100
retTip = retTip / 100
否则, convertInput()
您都应该将convertInput()
函数更改为始终返回浮点数。 我建议后者:
def convertInput(meal, tax, tip):
retMeal = float(meal)
retTax = float(tax)
retTip = float(tip)
return retMeal, retTax, retTip
这样,当您以后将它们除以100时,会得到分数。 否则,您可能最终会得到int
结果的税款或小费,并在计算中获得了四舍五入的值。
还有另一种方法可以更改Python关于除法的行为,使用Python 2.x中的from __future__ import division
语句(适用于某些Python 3.x规则)。 我现在不会详细介绍,但是现在您想了解更多有关Google的知识。
该retMeal
, retTax
和retTip
变量是本地convertInput
和你不使用该函数的返回值,添加assignement:
retMeal, retTax, retTip = convertInput(meal, tax, tip)
除了别人指出的以外,我真的没有真正需要的功能
def convertInput(meal, tax, tip):
从一开始就使用浮点数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.