Python 2.7.14菜单选择逻辑异常:所有选项均触发重置密码
问题排查与修复方案
我一眼就看出问题出在菜单选择的条件判断逻辑上,这是Python新手很容易踩的坑!
核心问题:错误的布尔表达式写法
你写的条件判断比如:
if "3" or "reset" or "Reset" in menu_select:
在Python里,这个表达式的逻辑是先判断"3"是否为真——而非空字符串在Python里都是True,所以这个条件永远成立!不管你输入的menu_select是什么,第一个if块都会被执行,这就是为什么所有选项都触发重置密码流程的原因。
正确的写法应该是逐个判断每个字符串是否存在于menu_select中,或者用更简洁的方式检查输入是否在目标列表里。
修复后的代码
我把菜单部分的条件判断全部修正了,同时优化了一些细节:
import pickle import time # Beginning of program. print ("Welcome to The Maze!") time.sleep(2) print ("Please enter your password to continue, or create a new one.") has_pass = "false" pass_correct = "false" pass_input = "null" password = "null" try: with open('save_pass.dat', 'r') as sp: password, has_pass = pickle.load(sp) except FileNotFoundError: # 处理文件不存在的情况,避免首次运行报错 has_pass = "false" if has_pass=="true": while pass_correct=="false": pass_input = raw_input("INSERT PASSWORD: ") if pass_input==password: pass_correct = "true" print ("Password Correct") elif has_pass=="false": password = raw_input("CREATE A NEW PASSWORD: ") has_pass = "true" with open('save_pass.dat', 'w') as sp: pickle.dump([password, has_pass], sp, protocol=2) # Defining loadGame() def loadGame(): pass # Defining newGame() def newGame(): print("Are you sure? You will overwrite any existing data.") reset = raw_input() # 修正这里的条件判断 if "no" in reset.lower(): menu() elif "yes" in reset.lower(): level = 0 points = 0 with open('level_save.dat', 'w') as ls: pickle.dump([level, points], ls, protocol=2) loadGame() else: print("Invalid input, please enter yes or no.") newGame() # Defining menu() def menu(): print 10 * "~" , "Menu" , 10 * "~" print("1. New game\n2. Load previous game\n3. Reset password\n4. Exit") print("~" * 26) time.sleep(6) menu_select = raw_input("Please choose an option: ").strip() # 修正条件判断逻辑 if menu_select in ["3", "reset", "Reset"]: with open('save_pass.dat', 'r') as sp: password, has_pass = pickle.load(sp) pass_correct = "false" if has_pass=="true": while pass_correct=="false": pass_input = raw_input("INSERT PASSWORD: ") if pass_input==password: pass_correct = "true" print ("Password Correct") password = raw_input("CREATE A NEW PASSWORD: ") has_pass = "true" with open('save_pass.dat', 'w') as f: pickle.dump([password, has_pass], f, protocol=2) time.sleep(2) print("Password succesfully saved!") time.sleep(5) menu() elif menu_select in ["4", "exit", "Exit", "quit", "Quit"]: exit() elif menu_select in ["1", "Newgame", "newgame", "new", "New"]: newGame() menu() elif menu_select in ["2", "load", "Load", "previous"]: # 补充加载游戏的逻辑调用 loadGame() menu() else: print("Invalid option, please try again.") menu() # 启动菜单 menu()
额外优化点
- 增加了
try-except处理save_pass.dat文件不存在的情况,避免首次运行程序时报错 - 对
newGame()里的输入判断做了优化,用lower()统一转为小写,不用重复判断大小写 - 补充了无效输入的处理逻辑,避免程序卡住
- 给菜单选择加上了
.strip(),去除输入前后的空格,提高容错性
关键知识点提醒
在Python中,布尔表达式的逻辑要严谨:
- 错误写法:
if "a" or "b" in x→ 永远为True,因为"a"是真值 - 正确写法:
if "a" in x or "b" in x或者if x in ["a", "b"]
内容的提问来源于stack exchange,提问作者AwesomePuppy
相关产品推荐
相关产品推荐

