【问题标题】:UnboundLocalError:local variable 'final_result' referenced before assignment..djangoUnboundLocalError:分配之前引用的局部变量'final_result'..django
【发布时间】:2021-05-13 13:13:16
【问题描述】:

我是编程和 Django 的初学者。我正在做一个计算器。但我收到一个错误(UnboundLocalError:local variable 'final_result' referenced before assignment)。代码是

from django.http import HttpResponse
from django.shortcuts import render
import re

def clculator(request):
    pass


def calculation(request):
    if request.method == "POST":
        values = request.POST['values']
        print(values)
        vals = re.findall(r"(\d+)", values)
        operators=['+','x','÷','-','.','%']
        opr = []

        for v in values:
            for o in operators:
                if v == o:
                    opr.append(o)
            
        print(opr)
        print(re.findall(r"(\d+)", values))

        for o in (opr):
            if o=='.':
                i=opr.index(o)
                res=vals[i]+"."+vals[i+1]
                vals.remove(vals[i+1])
                opr.remove(opr[i])
                vals[i]=res
                print(vals)
                print(opr)

        for o in opr:
            if o == '%':
                i = opr.index(o)
                res =(float(vals[i])/100)*float(vals[i+1])
                vals.remove(vals[i+1])
                opr.remove(opr[i])
                vals[i]= res
                print(vals)
                print(opr)
              
        for o in opr:
            if o == '÷':
                i = opr.index(o)
                res = float(vals[i])/float(vals[i+1])
                vals.remove(vals[i+1])
                opr.remove(opr[i])
                vals[i] = str(res)
                print(vals)
                print(opr)


        for o in opr:
            if o == 'x':
                i = opr.index(o)
                res = float(vals[i])*float(vals[i+1])
                vals.remove(vals[i+1])
                opr.remove(opr[i])
                vals[i] = str(res)
                print(vals)
                print(opr)

        for o in opr:
            if o == '+':
                i = opr.index(o)
                res = float(vals[i])+float(vals[i+1])
                vals.remove(vals[i+1])
                opr.remove(opr[i])
                vals[i] = str(res)
                print(vals)
                print(opr)
                

        for o in opr:
            if o == '-':
                i = opr.index(o)
                res = float(vals[i])-float(vals[i+1])
                vals.remove(vals[i+1])
                opr.remove(opr[i])
                vals[i] = str(res)
                print(vals)
                print(opr)

        if len(opr) != 0:
            if opr[0] == '÷':
                result = float(vals[0])/float(vals[1])
            elif opr[0] == 'x':
                result = float(vals[0])*float(vals[1])
            elif opr[0] == '+':
                result = float(vals[0])+float(vals[1])
            else:
                result = float(vals[0])-float(vals[1])

        else:
            result = float(vals[0])


        final_result = round(result,2)
        print(final_result)


    return render(request, 'calc/index.html', {'result':final_result, 'values':values})

我不知道问题出在哪里。请帮我解决这个问题

【问题讨论】:

  • 您的变量已在 POST 上设置。你似乎做了一个 GET 。
  • 再仔细看看错误信息。它告诉您错误在哪一行,甚至列出该行。这就是为什么指南坚持在您的问题中包含完整的堆栈跟踪

标签: python python-3.x django django-models django-views


【解决方案1】:

变量final_result 的范围在if request.method == "POST": 内。但是您已经在外部 if 的 return 语句中使用了它。如果这仅用于“POST”,则在返回语句中添加空格,使其与if request.method == "POST": 匹配。那么错误应该消失了。

【讨论】:

    【解决方案2】:

    您应该在 if 语句之前定义变量“final_result”和“values”。 这是了解有关范围https://pythonspot.com/scope/ 的更多信息的好来源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2020-01-16
      • 2019-12-05
      • 2017-09-19
      相关资源
      最近更新 更多