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从未被赋值,会再次触发变量未定义的报错。
修正方法
最规范的变量复用方式是通过函数参数传值,不要滥用全局变量(全局变量容易在多函数调用时被意外修改,提升调试成本)。修正步骤如下:
- 调用
anual_salary(),用变量接收它返回的薪资值 - 给
fed_tax()增加入参,用来接收传入的薪资值 - 重写条件判断逻辑,统一把用户输入转成小写后匹配,避免大小写导致的匹配失败
- 补全非法输入的分支逻辑,避免后续代码引用未定义的变量
修正后的可运行代码:
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
相关产品推荐
相关产品推荐

