Python帮助-带有"赋值前引用的局部变量"



我在shell中遇到问题,说赋值前引用了局部变量,我觉得以前的任何答案都没有帮助。我能对这个代码有一些具体的建议吗:

错误:TotalExcessCharge=ExcessOneCharge+ExcessTwoCharge+excessThreeChare+ExcessFourCharge+ExessFiveCharge+ExcessPlusLimitChargeUnboundLocalError:在分配之前引用了本地变量"ExcessThreeCharge">

def BillingSystem(CustomerName,CustomerType,TotalGBUsed):
    StandardCustomer = 1500
    StandardQuota = 25
    PremiumCustomer = 2500
    PremiumQuota = 50
    if (CustomerType == "Standard") or (CustomerType == "standard"):
        if (TotalGBUsed > StandardQuota):
            ExcessGB = TotalGBUsed - StandardQuota
            for a in range(0, ExcessGB):
                if (a <= 10):
                    ExcessOne = 250
                    ExcessOneCharge = a * ExcessOne
            for b in range(0, ExcessGB):
                if (b > 10) and (b <= 20):
                    ExcessTwo = 500
                    ExcessTwoCharge = b * ExcessTwo
            for c in range(0, ExcessGB):
                if (c > 20) and (c <= 30):
                    ExcessThree = 750
                    ExcessThreeCharge = c * ExcessThree
            for d in range(0, ExcessGB):
                if (d > 30) and (d <= 40):
                    ExcessFour = 1000
                    ExcessFourCharge = d * ExcessFour
            for e in range(0, ExcessGB):
                if (e > 40) and (e <= 50):
                    ExcessFive = 1250
                    ExcessFiveCharge = e * ExcessFive
            for explus in range(0, ExcessGB):
                if (explus > 50):
                    ExcessPlusLimit = 1500
                    ExcessPlusLimitCharge = explus * ExcessPlusLimit
        TotalExcessCharge = ExcessOneCharge + ExcessTwoCharge + ExcessThreeCharge + ExcessFourCharge + ExcessFiveCharge + ExcessPlusLimitCharge
        TotalCharge = StandardCustomer + TotalExcessCharge
        print ("Total Excess Charge : " + str(TotalExcessCharge))
        print ("Total Charge for this month : " + str(TotalCharge))
    else:
        print ("Total Excess Charge : 0")
        print ("Total Charge for this month : " + str(StandardCustomer))
CName = input("[!] Customer Name : ")
CType = input("[!] Customer Type : ")
TotGB = int(input("[!] Total GB Usage : "))
BillingSystem(CName,CType,TotGB)

显然,在这一点上:

TotalExcessCharge = ExcessOneCharge + ExcessTwoCharge + ExcessThreeCharge + ExcessFourCharge + ExcessFiveCharge + ExcessPlusLimitCharge

您的ExcessThreeCharge变量尚未分配给,这是因为您在条件下分配给它

        for c in range(0, ExcessGB):
            if (c > 20) and (c <= 30):
                ExcessThree = 750
                ExcessThreeCharge = c * ExcessThree

如果CCD_ 2是&lt20.

我不会建议你如何修复它,因为坦率地说,我不理解这个代码的基本逻辑——对我来说,这似乎完全没有意义

这里的问题是,当你的代码没有进入if条件时,你的变量永远不会被启动,但你在最后引用了它们。。。因此,错误清楚地告诉您正在调用从未创建或分配过的变量。始终确保引用指定的变量!

而且你还可以像一样让你的代码更容易阅读

  • 直接在if条件内使用Excess#值,而不将其分配给变量
  • 对输入字符串使用upper函数,并一次性比较值
def BillingSystem(CustomerName,CustomerType,TotalGBUsed):
    StandardCustomer = 1500
    StandardQuota = 25
    PremiumCustomer = 2500
    PremiumQuota = 50
    ExcessOneCharge=0
    ExcessTwoCharge=0
    ExcessThreeCharge=0
    ExcessFourCharge=0
    ExcessFiveCharge=0
    ExcessPlusLimitCharge=0

    if (CustomerType.upper() == "STANDARD"):
        if (TotalGBUsed > StandardQuota):
            ExcessGB = TotalGBUsed - StandardQuota
            for a in range(0, ExcessGB):
                if (a <= 10):
                    ExcessOneCharge = a * 250
                elif (a > 10) and (a <= 20):
                    ExcessTwoCharge = (a - 10) * 500
                elif (a > 20) and (a <= 30):
                    ExcessThreeCharge = (a - 20) * 750
                elif (a > 30) and (a <= 40):
                    ExcessFourCharge = (a - 30) * 1000
                elif (a > 40) and (a <= 50):         
                    ExcessFiveCharge = (a - 40) * 1250
                elif (a > 50):
                    ExcessPlusLimitCharge = (a - 50) * 1500
        TotalExcessCharge = ExcessOneCharge + 
                            ExcessTwoCharge + 
                            ExcessThreeCharge + 
                            ExcessFourCharge + 
                            ExcessFiveCharge + 
                            ExcessPlusLimitCharge
        TotalCharge = StandardCustomer + TotalExcessCharge
        print ("Total Excess Charge : ", TotalExcessCharge)
        print ("Total Charge for this month : ", TotalCharge)
    else:
        print ("Total Excess Charge : 0")
        print ("Total Charge for this month : ", StandardCustomer)
CName = input("[!] Customer Name : ")
CType = input("[!] Customer Type : ")
TotGB = int(input("[!] Total GB Usage : "))
BillingSystem(CName,CType,TotGB)

也可以不创建ExcessOneCharge、ExcessTwoCharge变量等。您可以执行以下操作:

TotalExcessCharge = 0 #don't forget to initiate the variable at the beginning of the function
#then inside the if conditions
TotalExcessCharge += a*Excess#

这只是如何编写更干净代码的一个示例。。。您可以根据自己的要求应用逻辑!

注意:我正在用手机输入所有内容,所以请忽略拼写错误。。。

因为您对每个"Excess#Charge"变量的定义都在if语句中,所以出于某种原因,它们似乎没有运行。为了解决这个问题,我建议在开始时将所有变量定义为0,这样,如果没有多余的值,它将被简单地定义为0。例如,在这个类的顶部:

ExcessOneCharge = 0
ExcessTwoCharge = 0
ExcessThreeCharge = 0
ExcessFourCharge = 0
ExcessFiveCharge = 0
ExcessPlusLimitCharge = 0

最新更新