You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:不使用全局变量,解决函数调用时root1未定义问题

问题解决:NameError: name 'root1' is not defined

核心问题

你调用Print函数时传入的root1和root2在当前作用域未定义——QuadRoots函数的返回值没有被正确解构提取,导致这两个变量根本不存在。另外代码还有两个隐性问题:循环内重复定义函数、输出时系数顺序颠倒(和你预期的输出格式不符)。

修复方案

  1. 将函数移至main外部:避免在循环中反复定义函数,提升代码效率和可读性。
  2. 正确解构QuadRoots的返回值:根据返回值的长度和第一个元素的标识,提取对应的根变量。
  3. 调整输出的系数顺序:匹配你给出的示例输出格式(A作为二次项系数,B作为一次项系数)。
  4. 优化Print函数参数:无需单独传入root1和root2,直接利用QuadRoots的返回结果处理输出,减少参数冗余。

修正后的完整代码

import math

def GetInputs():
    numA = int(input("What is coefficient A?"))
    numB = int(input("What is coefficient B?"))
    numC = int(input("What is coefficient C?"))
    return numA, numB, numC

def QuadRoots(numA, numB, numC):
    if numA == 0:
        return (-1,)
    
    discriminant = numB ** 2 - 4 * numA * numC
    
    if discriminant < 0:
        return (-2,)
    elif discriminant > 0:
        numnegB = -numB
        sqrt_disc = math.sqrt(discriminant)
        root1 = (numnegB + sqrt_disc) / (2 * numA)
        root2 = (numnegB - sqrt_disc) / (2 * numA)
        return (0, root1, root2)
    else:
        numnegB = -numB
        root1 = numnegB / (2 * numA)
        return (1, root1)

def Print(numA, numB, numC, result):
    equation_str = f"{numA}x^2 + {numB}x + {numC}"
    kind = result[0]
    if kind == -1:
        print("This is a line; not a Quadratic Equation.")
    elif kind == -2:
        print(f"{equation_str} has no solution.")
    elif kind == 0:
        root1, root2 = result[1], result[2]
        print(f"{equation_str} has solutions {root1} and {root2}.")
    elif kind == 1:
        root1 = result[1]
        print(f"{equation_str} has unique solution {root1}.")

def main():
    while True:
        numA, numB, numC = GetInputs()
        result = QuadRoots(numA, numB, numC)
        Print(numA, numB, numC, result)
        
        askuser = input("Do you want to solve another equation? Type Y for yes and N for no:")
        if askuser.lower() == "n":
            print("Goodbye!")
            break
        elif askuser.lower() == "y":
            continue
        else:
            print("Please type Y or N")
            break
            
main()

关键修复点说明

  • 所有函数都移到main外部,避免循环内重复定义。
  • QuadRoots的返回值统一用元组格式,方便后续判断和解构。
  • Print函数接收QuadRoots的返回元组,根据第一个元素判断方程类型,再提取对应根。
  • 用f-string简化输出字符串的拼接,同时修正了系数顺序,确保输入1、3、2时输出正确的1x^2 + 3x + 2 has solutions -1.0 and -2.0.。
  • 调用Print时不再需要传入未定义的root1和root2,而是传入完整的结果元组。

内容的提问来源于stack exchange,提问作者axpxvaiah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:16:05