如何修复UnboundLocalError错误?

时间:2015-04-17 19:19:41

标签: python

我制作了一个程序,用于计算墙的周长,然后根据输入计算绘制墙壁所需的油漆成本。

代码:

def main():
length = float(input('Enter length: ')) #Get length.
width = float(input('Enter width: ' )) #Get width.
height = float(input('Enter height: ')) #Get height.
Paint_cost()
def Paint_cost (length, width, height): #Find total paint cost.
    perimeter = length + width *4 #Find perimiter.
sq_ft = perimeter * height #Find total sq. ft. amount.
Paint = sq_ft / 300 #Calculate paint gallons to nearest int.
round(Paint)
Total= Paint*40 #Calculate total cost.
return total #Display total.

main()

然而,Python一直在说" UnboundLocalError:局部变量' Paint_cost'在转让之前引用"。我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

你有一些问题:

  • 首先,您要在Paint_cost()内定义函数main()。您可以在main()之外定义它,只要在调用main()函数之前定义它,它就能正常工作。
  • 其次,return从函数返回一个值,而不是打印它。
  • 第三,你的缩进是关闭的。无论其他两个错误如何,如果你试图运行它,Python都会引发IndentationError
  • 第四,total未定义(您将其写为Total。)
  • 最后,你在没有任何参数的情况下调用Paint_cost()。您需要使用Paint_cost(length, width, height)
  • 进行调用

此代码在Python 3中完美运行:

def Paint_cost (length, width, height): #Find total paint cost.
    perimeter = length + width * 4 #Find perimiter.
    sq_ft = perimeter * height #Find total sq. ft. amount.
    Paint = sq_ft / 300 #Calculate paint gallons to nearest int.
    int(Paint)
    total = Paint*40 #Calculate total cost.
    return total #Display total.
def main():

    length = float(input('Enter length: ')) #Get length.
    width = float(input('Enter width: ' )) #Get width.
    height = float(input('Enter height: ')) #Get height.
    print(Paint_cost(length, width, height)) # Print the cost of the paint.

main()

这是针对Python 2的:

def Paint_cost (length, width, height): #Find total paint cost.
    perimeter = length + width * 4 #Find perimiter.
    sq_ft = perimeter * height #Find total sq. ft. amount.
    Paint = sq_ft / 300 #Calculate paint gallons to nearest int.
    int(Paint)
    total = Paint*40 #Calculate total cost.
    return total #Display total.
def main():

    length = float(input('Enter length: ')) #Get length.
    width = float(input('Enter width: ' )) #Get width.
    height = float(input('Enter height: ')) #Get height.
    print Paint_cost(length, width, height)  # Print the cost of the paint.

main()

具体来说,在这段代码中,print是Python 2和3之间唯一的变化。该功能在任何一个版本中都无需打印。
如果出现问题,请告诉我。

答案 1 :(得分:0)

您在定义之前调用函数Paint_cost。将Paint_cost函数移到main之外,程序应该没有问题。

def Paint_cost (length, width, height): #Find total paint cost.
    return length + width *4 #Find perimiter.
    sq_ft = perimeter * height #Find total sq. ft. amount.
    Paint = sq_ft / 300 #Calculate paint gallons to nearest int.
    round(Paint)
    return Paint*40 #Calculate total cost.

def main():
    length = float(input('Enter length: ')) #Get length.
    width = float(input('Enter width: ' )) #Get width.
    height = float(input('Enter height: ')) #Get height.
    return Paint_cost(length, width, height)

main()

其他说明:您在total的最后一行返回main(),但在任何地方都没有定义。 Python区分大小写,因此totalTotal不是一回事。

答案 2 :(得分:0)

  

然而,Python一直说“在赋值之前引用了UnboundLocalError:局部变量'Paint_cost'”。我在这里做错了什么?

究竟是什么意思:

Paint_cost()
def Paint_cost (length, width, height): #Find total paint cost.
    perimeter = length + width *4 #Find perimiter.
    # ...

你在定义它之前调用Paint_cost(),所以它没有任何东西可以调用,所以它会引发异常。


要解决这个问题,请不要这样做。定义后将调用移至Paint_cost。或者将Paint_cost的定义移到全局级别。 (如果它没有访问main中的任何局部变量,则不需要在main内定义。)


该消息可能会有些混乱,因为它指的是“分配”,而您正在做的是def Paint_cost(…):,而不是Paint_cost = …。但是def是一种赋值,因为它绑定了一个新名称。