如何在Python其他函数中调用set_budget函数获取的budget_amt变量
核心问题说明
你当前的代码存在两个核心错误导致无法传递预算值:
nonlocal关键字仅适用于嵌套在其他函数内部的子函数,用于引用外层函数的变量,你的new_transaction是顶层独立函数,使用nonlocal会直接触发语法错误。- 你调用
set_budget()时没有接收它的返回值,函数计算得到的预算金额直接被丢弃,自然无法传递给其他函数使用。
具体修正方案
1. 接收set_budget的返回值
你写的set_budget本身已经包含return budget_amt的逻辑,调用时用变量接住返回值即可:
# 把原代码中单独的 set_budget() 替换为下方代码 remaining_budget = set_budget()
我们用remaining_budget变量存储当前剩余预算,后续每次交易修改这个变量即可。
2. 为new_transaction添加参数和返回值
每次交易可能会修改预算余额,我们将当前预算作为参数传入new_transaction,修改完成后再把新的预算余额返回,方便后续交易调用:
def new_transaction(current_budget): print("新建交易") date = datetime.today() data = [] try: transaction_amt = float(input("请输入交易金额:\n$ ")) except ValueError: print("请输入有效数字") transaction_amt = float(input("请输入交易金额:\n$ ")) choice = input("该交易属于收入还是支出?\n [I/E]") if choice.lower() == "i": category = "收入" remarks = "无" confirmation = input("你确认要录入该笔交易吗?\n [Y/N]: ") while confirmation.lower() != 'y': print("交易已取消。") # 取消交易直接返回原预算即可,不需要递归调用 return current_budget print("交易录入成功。") # 原逻辑遗漏了收入增加预算的逻辑,此处补充 current_budget += transaction_amt if choice.lower() == "e": print(""" 可选分类列表: 餐饮 杂货 娱乐 其他 """) category = input("请从上方列表输入分类: ") remarks = input("备注,无则填无: ") confirmation = input("你确认要录入该笔交易吗? [Y/N]: ") while confirmation.lower() != 'y': print("交易已取消。") return current_budget # 原代码此处为死循环,已修改为单次判断 if transaction_amt > current_budget: print("余额不足,交易失败。") else : current_budget -= transaction_amt print("交易录入成功。") print("剩余预算: ", current_budget) if current_budget <= 0: print("你本月的预算已用尽。") # 注意原代码此处你append了5个字段,但storeValuesAsDF定义了6个列,需要补全用户名字段,否则会报错 data.append([date,current_budget, transaction_amt,remarks,category]) storeValuesAsDF(data) # 返回修改后的预算余额 return current_budget
3. 调用时传递参数并更新余额
如果需要多次录入交易,可以参考下方的调用逻辑:
remaining_budget = set_budget() # 示例:连续录入3笔交易 for _ in range(3): remaining_budget = new_transaction(remaining_budget)
其他优化建议
- 尽量不要用递归实现用户输入重试逻辑(比如输入错误就递归调用
set_budget),重试次数过多会触发栈溢出,改用while循环更稳妥。 - 你定义的
storeValuesAsDF中DataFrame的列有6个,但data.append只传入了5个值,会触发列数不匹配的报错,记得补充用户名字段。
内容的提问来源于stack exchange,提问作者Fong Hoe Hin
相关产品推荐
相关产品推荐

