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

如何在Python其他函数中调用set_budget函数获取的budget_amt变量

核心问题说明

你当前的代码存在两个核心错误导致无法传递预算值:

  1. nonlocal 关键字仅适用于嵌套在其他函数内部的子函数,用于引用外层函数的变量,你的new_transaction是顶层独立函数,使用nonlocal会直接触发语法错误。
  2. 你调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:45:05