Python 全局名称未定义错误

Python 全局名称未定义错误,python,return,global-variables,function,Python,Return,Global Variables,Function,我的折扣变量不断出错。名称错误:未定义全局名称“折扣”。请看一下我的代码并帮助我。我根本不想修改函数的参数 def finddiscount(quantity): if quantity >= 1 and quantity <= 9: discount = 0 elif quantity >= 10 and quantity <= 19: discount = .2 elif quantity >= 20 an

我的折扣变量不断出错。名称错误:未定义全局名称“折扣”。请看一下我的代码并帮助我。我根本不想修改函数的参数

def finddiscount(quantity):
    if quantity >= 1 and quantity <= 9:
        discount = 0
    elif quantity >= 10 and quantity <= 19:
        discount = .2
    elif quantity >= 20 and quantity <= 49:
        discount = .30
    elif quantity >= 50 and quantity <= 99:
        discount = .40
    elif quantity >= 100:
        discount = .50
    return discount
def calctotal(quantity, price):
    finddiscount(quantity)
    disc = (price*quantity)*discount
    total = (price*quantity)
    due = (price*quantity)-(price*quantity)*dicount
    print ("\t","Order total $",format(total, "10.2"),"\n\t","Discount    $",format(disc,"10.2"),"\n\t","Amount Due $",format (due, "10.2"),sep="")
def main():
    quantity = int(input("How many packages where purchased?"))
    price = float(input("How much is each item?"))
    calctotal(quantity, price)
main()
def FindDiscont(数量):
如果数量>=1,数量=10,数量=20,数量=50,数量=100:
折扣=.50
退货折扣
def calctotal(数量、价格):
FindDiscont(数量)
光碟=(价格*数量)*折扣
总计=(价格*数量)
到期日=(价格*数量)-(价格*数量)*结算
打印(“\t”,“订单总额$”,格式(总计,“10.2”),“\n\t”,“折扣$”,格式(光盘,“10.2”),“\n\t”,“到期金额$”,格式(到期,“10.2”),九月=”)
def main():
数量=整数(输入(“购买了多少个包裹?”)
价格=浮动(输入(“每个项目多少钱?”)
计算总数(数量、价格)
main()

如果要在多块作用域中访问它,必须将
折扣
声明为全局折扣

discount = 0

def finddiscount(quantity):
    ...
    global discount    # Needed to modify global copy of discount
    discount = 1

如果要在多块范围内访问它,必须将
折扣
声明为全局折扣

discount = 0

def finddiscount(quantity):
    ...
    global discount    # Needed to modify global copy of discount
    discount = 1
您从未在
calctotal
中定义过
折扣
(在全局范围内也没有定义)。将
finddiscount(数量)
中的结果分配给它。此时您正在计算折扣,但通过不将其分配给任何变量立即删除结果:

def calctotal(quantity, price):
    discount = finddiscount(quantity)
    disc = (price*quantity)*discount
    total = (price*quantity)
    due = (price*quantity)-(price*quantity)*dicount
    print ("\t","Order total $",format(total, "10.2"),"\n\t","Discount    $",format(disc,"10.2"),"\n\t","Amount Due $",format (due, "10.2"),sep="")
您从未在
calctotal
中定义过
折扣
(在全局范围内也没有定义)。将
finddiscount(数量)
中的结果分配给它。此时您正在计算折扣,但通过不将其分配给任何变量立即删除结果:

def calctotal(quantity, price):
    discount = finddiscount(quantity)
    disc = (price*quantity)*discount
    total = (price*quantity)
    due = (price*quantity)-(price*quantity)*dicount
    print ("\t","Order total $",format(total, "10.2"),"\n\t","Discount    $",format(disc,"10.2"),"\n\t","Amount Due $",format (due, "10.2"),sep="")

如果我们看看这段代码

def calctotal(quantity, price):
    finddiscount(quantity)
    disc = (price*quantity)*discount
    total = (price*quantity)
    due = (price*quantity)-(price*quantity)*dicount
    print ("\t","Order total $",format(total, "10.2"),"\n\t","Discount    $",format(disc,"10.2"),"\n\t","Amount Due $",format (due, "10.2"),sep="")
calctotal()
中既没有声明
折扣也没有声明
dicount
(我假设输入错误)。下面应该解决你的问题

def calctotal(quantity, price):
    discount = finddiscount(quantity)
    disc = (price*quantity)*discount
    total = (price*quantity)
    due = (price*quantity)-(price*quantity)*discount
    print ("\t","Order total $",format(total, "10.2"),"\n\t","Discount    $",format(disc,"10.2"),"\n\t","Amount Due $",format (due, "10.2"),sep="")
编辑: 虽然将
折扣
设置为全局变量肯定是一种方法,但通常我建议不要将变量设置为全局变量,除非您有充分的理由。例如,如果应用的折扣将受到外部函数的影响,并且您希望在
finddiscont()
中对其进行更改,那么全局变量将很好地工作。但是,在这种情况下,您将在
finddiscont()
中创建所有可能的
discount
值,使用赋值更有意义


全局变量的问题是,您可能会意外地将它们重新分配给您不打算执行的操作,如果没有任何原因,则会使名称空间变得混乱。

如果我们查看这段代码

def calctotal(quantity, price):
    finddiscount(quantity)
    disc = (price*quantity)*discount
    total = (price*quantity)
    due = (price*quantity)-(price*quantity)*dicount
    print ("\t","Order total $",format(total, "10.2"),"\n\t","Discount    $",format(disc,"10.2"),"\n\t","Amount Due $",format (due, "10.2"),sep="")
calctotal()
中既没有声明
折扣也没有声明
dicount
(我假设输入错误)。下面应该解决你的问题

def calctotal(quantity, price):
    discount = finddiscount(quantity)
    disc = (price*quantity)*discount
    total = (price*quantity)
    due = (price*quantity)-(price*quantity)*discount
    print ("\t","Order total $",format(total, "10.2"),"\n\t","Discount    $",format(disc,"10.2"),"\n\t","Amount Due $",format (due, "10.2"),sep="")
编辑: 虽然将
折扣
设置为全局变量肯定是一种方法,但通常我建议不要将变量设置为全局变量,除非您有充分的理由。例如,如果应用的折扣将受到外部函数的影响,并且您希望在
finddiscont()
中对其进行更改,那么全局变量将很好地工作。但是,在这种情况下,您将在
finddiscont()
中创建所有可能的
discount
值,使用赋值更有意义


全局变量的问题是,您可能会意外地将它们重新分配给您不打算执行的操作,如果没有任何原因,它可能会弄乱名称空间。

好的,我添加了它谢谢,好的,我添加了它谢谢,当我试图返回并声明它为全局时,它给了我一个错误名称“折扣”是在全局声明之前分配的。你能发布显示你原始声明的代码吗?@jeremyjjbrown我不知道认为
折扣
应该是全局的。实际上,在抛出错误的函数中有一个函数调用来计算它。@Nabla是否有意在所有这些方法中都没有其他方法来访问它,除非它作为参数传递。当我试图返回并将其声明为全局时,它给了我一个错误名称“折扣”,在全局声明之前分配。您可以发布代码吗这显示了您最初的
折扣声明
?@jeremyjjbrown我认为
折扣
不应该是全球性的。实际上,在抛出错误的函数中有一个函数调用来计算它。@Nabla是否有意在所有这些方法中都没有其他方法来访问它,除非它作为参数传递。