“分配前已引用本地变量'resol'”,但似乎无法理解原因

时间:2019-09-05 05:07:10

标签: python python-3.x

我试图创建一个可以解决简单方程式的函数,但是在添加了一系列“ if”以定义局部变量并随后打印后出现错误

def re_eq(eq):
    numbers = ""
    for char in eq:
        if char.isalpha():
            incog = char
        elif char.isdigit():
            numbers += char
            numbers += " "
        elif char.isascii():
            if char ==  "+" or "-" or "*" or "/":
                sym = char
    num1, num2 = numbers.split()
    if sym == "+":
        resol = int(num2) - int(num1)
    elif sym == "-":
        resol = int(num2) + int(num1)
    elif sym == "*":
        resol = int(num2) / int(num1)
    elif sym == "/":
        resol = int(num2) * int(num1)
    print(incog, " = ", resol)

只有在添加第二个链“ if”和“ elif”之后,问题才开始发生:

    resol = int(num2) * int(num1)
    print(incog, " = ", resol)

那时没有问题

在调用方程式时,应根据所使用的值显示“ x = 2”或类似内容,但我得到了

"local variable 'resol' referenced before assignment" 

我无法理解为什么在实际打印它之前先解析它的引用;我可以只使用“ return”,也可以使用全局变量,但我想至少了解正在发生的事情以及为什么要进行学习

(该函数在调用时会使用输入为“ 4 + x = 9”的参数进行调用)

2 个答案:

答案 0 :(得分:4)

if-elif链没有以else子句结尾。这意味着在某些情况下,控制权可能不会进入任何if-elif块中,在此期间根本不会创建变量resol并导致错误。

resol链之前将if-elif初始化为某个默认值,或添加一个else子句并在其中将resol初始化为默认值。

此外,更改此行

if char ==  "+" or "-" or "*" or "/":
  ...

if char in {"+", "-", "*", "/"}:
  ...

表达式if char == "+" or "-" or "*" or "/":将始终取值为Trueor的优先级比==低,这意味着它实际上按照if (char == "+") or "-" or "*" or "/":的顺序进行求值,因此,即使char不等于"+",“- “是一个非空str,始终为True。控件进入if语句,并且sym被赋予char所具有的任何值,即使这不是您想要的。

答案 1 :(得分:0)

if char == "+" or "-" or "*" or "/":并不意味着您认为的意思。它实际上与if True:相同,因为如果char不等于'+',则表达式等于'-',这是正确的,因为它的长度非零。您可能是说if char in '+-*/':。这意味着您的if/elif部分并不详尽,并且您从未尝试分配resol,但仍尝试打印它。