重启Python脚本后列表存旧值?Remove/Switch等函数失效排查
课程表Python脚本问题排查
一、重启脚本后subjects保留旧值的原因
Python脚本里的变量都存在内存中,脚本运行结束后内存会被系统清空,正常单独运行脚本(比如用python 文件名.py)不会出现重启后保留旧值的情况。唯一可能的场景是你在交互式环境(比如IDLE、Python命令行)里反复执行代码块,之前的subjects变量没被清理,会被后续代码重复使用。如果是单独运行脚本,每次启动都会重新从输入初始化subjects,不会有残留。
二、Remove、Switch功能失效及kill函数未生效的原因
1. Remove功能失效
- 条件判断冗余且有漏洞:代码里重复检查
"Remove" in multianswer完全没必要,但真正的问题是如果输入格式错误(比如Remove:后面没内容),multianswer.split(":")[1]会直接抛出索引越界错误,导致代码跳过Remove分支。 - 额外说明:
list.remove()只会删除第一个匹配的元素,如果有重复课程,只会删掉第一个,这是方法本身的特性,若需求是删除所有匹配项,需要改用循环遍历删除。
2. Switch功能失效
- 语法错误:代码里写了
multianswer.append(":")[2],但multianswer是字符串,根本没有append()方法,这里应该改成multianswer.split(":")[2]。 - 逻辑错误:当前代码是移除第一个指定课程然后追加到列表末尾,这和"Switch(交换)"的需求不符。如果是要交换两个课程的位置,需要找到两个课程的索引然后互换,而不是删一个加一个。
3. kill函数未生效
脚本里完全没有处理kill指令的代码分支,既没有判断输入是否为kill,也没有对应的执行逻辑,自然不会有任何效果。
修正后的核心代码片段
n = 8 schedule = input() subjects = schedule.split("->") # 直接分割生成列表,不用逐个赋值 while n == 8: multianswer = input().strip() parts = multianswer.split(":") if not parts: continue cmd = parts[0] if cmd == "Add": if len(parts) >= 2: subjects.append(parts[1]) print(subjects) elif cmd == "Insert": if len(parts) >= 3 and parts[2].isdigit(): idx = int(parts[2]) if 0 <= idx <= len(subjects): # 防止索引越界 subjects.insert(idx, parts[1]) print(subjects) elif cmd == "Remove": if len(parts) >= 2 and parts[1] in subjects: subjects.remove(parts[1]) print(subjects) elif cmd == "Switch": if len(parts) >= 3 and parts[1] in subjects and parts[2] in subjects: # 交换两个课程的位置 idx1 = subjects.index(parts[1]) idx2 = subjects.index(parts[2]) subjects[idx1], subjects[idx2] = subjects[idx2], subjects[idx1] print(subjects) elif cmd == "kill": n = 0 # 修改循环条件,退出程序 print("程序已终止") elif multianswer == "start academy": print("Academy started")
内容的提问来源于stack exchange,提问作者Fatko
相关产品推荐
相关产品推荐

