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

Python跨函数调用anual_salary返回值报变量未定义解决方法

问题分析

你的代码有三个会导致运行异常/逻辑错误的核心问题:

  • 局部变量访问违规:salary是定义在anual_salary()内部的局部变量,作用域仅在anual_salary()函数范围内,fed_tax()没有直接访问该变量的权限。虽然anual_salary()最后返回了salary,但你既没有调用该函数接收返回值,也没有将薪资值传入fed_tax(),自然会触发“变量未定义”的报错。
  • 条件判断逻辑完全失效:你写的if esbi == "Employee" or "employee" 是Python新手最常见的语法错误之一。or连接的是两个独立的布尔表达式,后面单独的"employee"是非空字符串,布尔值恒为True,这意味着不管你输入什么身份,第一个判断分支永远成立,后续的税率分支根本不会执行。
  • 隐含边界错误:如果用户输入了不在选项内的内容,代码会走到else分支打印错误提示,但后续依然会执行round(fed_income_tax, 2),此时fed_income_tax从未被赋值,会再次触发变量未定义的报错。
修正方法

最规范的变量复用方式是通过函数参数传值,不要滥用全局变量(全局变量容易在多函数调用时被意外修改,提升调试成本)。修正步骤如下:

  1. 调用anual_salary(),用变量接收它返回的薪资值
  2. 给fed_tax()增加入参,用来接收传入的薪资值
  3. 重写条件判断逻辑,统一把用户输入转成小写后匹配,避免大小写导致的匹配失败
  4. 补全非法输入的分支逻辑,避免后续代码引用未定义的变量

修正后的可运行代码:

def anual_salary():
    salary = int(input("Enter your salary: "))
    print(f"Gross income is ${salary}")
    print(" ")
    return salary

def fed_tax(salary):
    esbi = input("Are you an Employee, Self Employed, Business owner, or Investor? ").strip()
    # 统一转小写做匹配,兼容用户大小写混输的情况
    esbi = esbi.lower()
    if esbi == "employee":
        fed_income_tax = .37 * salary
    elif esbi == "self employed":
        fed_income_tax = .35 * salary
    elif esbi == "business owner":
        fed_income_tax = .20 * salary
    elif esbi == "investor":
        fed_income_tax = .15 * salary
    else:
        print("Incorrect answer!")
        return
    fed_income_tax = round(fed_income_tax, 2)
    print(f"Your Federal Income Tax is ${fed_income_tax}")
    print(" ")
    return fed_income_tax

# 程序执行入口
if __name__ == "__main__":
    # 先获取薪资,后续所有需要用到薪资的函数都可以传入这个值复用
    user_salary = anual_salary()
    fed_tax(user_salary)

后续如果新增其他需要用到薪资的计算函数,只需要给对应函数增加薪资入参,把user_salary传进去即可,不需要重复写输入薪资的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:55:00