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

Python While循环未校验输入便提前终止问题排查

问题分析与修复:Python输入校验循环逻辑错误

问题现象

代码中种族(race)与职业(pclass)的输入校验while循环存在逻辑错误,无论输入任何内容都会直接通过校验,完全无法过滤无效输入。

错误原因

核心问题出在if条件的逻辑判断写法上。以种族校验的代码为例:

if race == "elf" or "orc" or "human" or "dragonborn" or "halfling" or "tiefling" or "gnome" or "dwarf":

Python会将这个表达式解析为:(race == "elf") or ("orc") or ("human") ...。由于非空字符串在布尔判断中会被判定为True,所以无论race输入什么值,整个if条件都会成立,直接执行raceloop = False退出循环,完全起不到校验作用。

修复方案

推荐使用集合+in运算符的方式做校验,代码更简洁易维护,也避免重复书写判断条件:

修复后的种族校验循环

raceloop = True
while raceloop == True:
    race = input("And what type of creature are you?\n")
    race = race.lower()
    # 将合法种族存入集合,用in判断输入是否合法
    valid_races = {"elf", "orc", "human", "dragonborn", "halfling", "tiefling", "gnome", "dwarf"}
    if race in valid_races:
        raceloop = False
    elif race == "help":
        print("Pick a race. The valid races are: Elf, Orc, Human, Dragonborn, Halfling, Tiefling, Gnome and Dwarf.")
        continue
    else:
        print("That is not a valid race. Type \"Help\" for help.")

修复后的职业校验循环

(注:原代码中职业帮助提示存在笔误,将"valid classes"写成了"valid races",此处一并修正)

classloop = True
while classloop == True:
    pclass = input("And what profession do you have?\n")
    pclass = pclass.lower()
    valid_classes = {"barbarian", "bard", "cleric", "druid", "fighter", "monk", "paladin", "ranger", "rogue", "sorcerer", "warlock", "wizard"}
    if pclass in valid_classes:
        classloop = False
    elif pclass == "help":
        print("Pick a class. The valid classes are: Barbarian, Bard, Cleric, Druid, Fighter, Monk, Paladin, Ranger, Rogue, Sorcerer, Warlock and Wizard.")
        continue
    else:
        print("That is not a valid class. Type \"Help\" for help.")

完整修复后的代码

import dice
import functions

playerinfo = functions.load()
playerinfo = playerinfo.split(",")
level = playerinfo[0]
if level == "":
    print("It looks like you are just beginning, or your data has been corrupted.\nYou will now be started from the beginning.")
    name = input("What is your name?\n")
    raceloop = True
    while raceloop == True:
        race = input("And what type of creature are you?\n")
        race = race.lower()
        valid_races = {"elf", "orc", "human", "dragonborn", "halfling", "tiefling", "gnome", "dwarf"}
        if race in valid_races:
            raceloop = False
        elif race == "help":
            print("Pick a race. The valid races are: Elf, Orc, Human, Dragonborn, Halfling, Tiefling, Gnome and Dwarf.")
            continue
        else:
            print("That is not a valid race. Type \"Help\" for help.")
    classloop = True
    while classloop == True:
        pclass = input("And what profession do you have?\n")
        pclass = pclass.lower()
        valid_classes = {"barbarian", "bard", "cleric", "druid", "fighter", "monk", "paladin", "ranger", "rogue", "sorcerer", "warlock", "wizard"}
        if pclass in valid_classes:
            classloop = False
        elif pclass == "help":
            print("Pick a class. The valid classes are: Barbarian, Bard, Cleric, Druid, Fighter, Monk, Paladin, Ranger, Rogue, Sorcerer, Warlock and Wizard.")
            continue
        else:
            print("That is not a valid class. Type \"Help\" for help.")

else:
    item1 = playerinfo[1]
    item2 = playerinfo[2]
    item3 = playerinfo[3]
    pclass = playerinfo[4]
    race = playerinfo[5]
    name = playerinfo[6]
    stage = playerinfo[7]

functions.save("1","Magic Sword","Potion","Magic Axe",pclass,race,name,"1")
functions.savestats("20","20","20","20","20","20","20")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:35:22