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

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()

额外优化点

  1. 增加了try-except处理save_pass.dat文件不存在的情况,避免首次运行程序时报错
  2. 对newGame()里的输入判断做了优化,用lower()统一转为小写,不用重复判断大小写
  3. 补充了无效输入的处理逻辑,避免程序卡住
  4. 给菜单选择加上了.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:09:55