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

从其他文件导入变量后值被还原的技术问题求助

Python模块导入后变量值回退问题

我用Python写了一套程序,通过父程序menu.py使用exec调用子文件。其中input_data.py从accuracy.py导入变量,修改后再写回accuracy.py。但遇到以下问题:运行父程序进入input_data.py修改变量,返回父程序后再次进入,变量会变回修改前的值。我排查发现变量还原发生在导入环节——导入前打印accuracy.py内容是修改后的正确值,但导入后变量就变回旧值。尝试添加f.flush()无效,另有类似程序可正常运行。

父程序(menu.py)代码

while True:
    print()
    print("----------------------------------------------------------")
    print("菜单:")
    print()
    print("输入1进行自我测试")
    print()
    print("输入2修改或查看配对项")
    print()
    print("输入3录入解题数据")
    print()
    print("输入.退出")

    while True:
        choice = input()

        if choice in ["1", "2", "3", "."]:
            break

        else:
            print("请输入1、2、3或.")

    if choice == "1":
        print()
        print("----------------------------------------------------------")
        print("测试:")
        print()
        exec(open("quiz.py").read())

    elif choice == "2":
        print()
        print("----------------------------------------------------------")
        print("配对项:")
        print()
        exec(open("pairs.py").read())

    elif choice == "3":
        print()
        print("----------------------------------------------------------")
        print("录入数据:")
        print()
        exec(open("input_data.py").read())

    elif choice == ".":
        break

问题文件(input_data.py)代码

print(open("accuracy.py").read())

from accuracy import attempts, DNF, solves, current_streak, longest_streak

print(open("accuracy.py").read())

print("按.返回菜单")


while True:
    print()
    print("尝试次数: ", attempts)
    print("未完成次数(DNF): ", DNF)
    print("完成次数: ", solves)
    print("正确率: {}".format( 100 * solves / attempts))
    print("当前连续完成次数: ", current_streak)
    print("最长连续完成次数: ", longest_streak)
    print()


    print("你完成解题了吗?")
    foo = input("是或否: ").upper()

    if foo == "YES":
        print(":(")
        DNF += 1
        attempts += 1

        current_streak = 0


    elif foo == "NO":
        print(":)")
        solves += 1
        attempts += 1

        current_streak += 1

        if current_streak > longest_streak:
            longest_streak = current_streak


    elif foo == ".":
        break


# 奇怪的是,不结束menu.py的话,写入操作好像没生效
# 比如,启动menu后进入input_data修改数据,返回menu再重新进入input_data,
# 数据会变回最开始的初始值。

with open("accuracy.py", "w") as f:
    f.write("attempts = {}\nDNF = {}\nsolves = {}\ncurrent_streak = {}\nlongest_streak = {}".format(attempts, DNF, solves, current_streak, longest_streak))
    f.flush()

变量存储文件(accuracy.py)代码

attempts = 251
DNF = 104
solves = 147
current_streak = 0
longest_streak = 9

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:36:14