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

Python登录程序输入非列表密码触发ValueError问题求助

Python登录注册程序的ValueError问题排查

我编写了一个Python登录注册程序,将用户名和密码分别存储在列表中,登录时需要输入用户名和密码进行验证:

import sys
global x
global y

lolusrnm = []
lolpasswrd = []
def login_function():
    while True:
        global usrnm
        usrnm = str(input("please enter your username : "))
        if usrnm in lolusrnm:
            while True:
                global passwrd
                global chkusrnmindx
                global chkpasswrdindx
                passwrd = str(input("Please enter your password : "))
                chkusrnmindx = lolusrnm.index(usrnm)
                chkpasswrdindx = lolpasswrd.index(passwrd)
                if passwrd in lolpasswrd and chkpasswrdindx == chkusrnmindx:
                    print("uou are in ")
                    sys.exit()
                
                elif passwrd not in lolpasswrd:
                    print("password dont match try again")
                else:
                    global quot2
                    print("Wrong password, try again")
                    quot2 = str(input("do u want to continue "))
                    if quot2 == "Y":
                        continue
                    elif quot2 == "N":
                        
                        sys.exit()                  
        else:
            print("Username dosent match..")
def signup_function():
    while True:
        global x
        global y
        print("Enter your username")
        x = str(input())
        lolusrnm.append(x)
        y = str(input("Enter your password : " ))
        lolpasswrd.append(y)
        global sassy
        sassy = input("Do you want to (L)ogin? or continue to (S)ign up another account?")
        if sassy == "L":
            login_function()
        elif sassy == "S":
            continue
        
signup_function()

运行程序完成注册后,使用已注册的用户名登录,输入不在密码列表中的密码时,程序触发以下ValueError错误:

Traceback (most recent call last):
  File "c:\Users\chand\Desktop\PythonBrocode.py", line 52, in <module>       
    signup_function()
  File "c:\Users\chand\Desktop\PythonBrocode.py", line 48, in signup_function
    login_function()
  File "c:\Users\chand\Desktop\PythonBrocode.py", line 18, in login_function 
    chkpasswrdindx = lolpasswrd.index(passwrd)
ValueError: '(whatever password i enter which is not in the list)' is not in list

尽管我已经编写了针对密码不在列表中的处理逻辑:

elif passwrd not in lolpasswrd:
    print("password dont match try again")

我是Python新手,请求帮助排查该问题,谢谢!


问题原因

你写的代码里,先执行了chkpasswrdindx = lolpasswrd.index(passwrd),之后才判断passwrd not in lolpasswrd。当密码不在密码列表中时,list.index()方法会直接抛出ValueError,程序根本走不到后面的elif分支,所以你的错误处理逻辑根本没机会执行。

解决方案

方案1:调整代码执行顺序,先判断密码是否存在

把密码存在性的判断放在调用index()方法之前,这样就能避免异常:

import sys

lolusrnm = []
lolpasswrd = []

def login_function():
    while True:
        usrnm = str(input("please enter your username : "))
        if usrnm in lolusrnm:
            while True:
                passwrd = str(input("Please enter your password : "))
                # 先判断密码是否在列表中
                if passwrd not in lolpasswrd:
                    print("password dont match try again")
                    continue
                # 密码存在时再获取索引
                chkusrnmindx = lolusrnm.index(usrnm)
                chkpasswrdindx = lolpasswrd.index(passwrd)
                if chkpasswrdindx == chkusrnmindx:
                    print("you are in ")
                    sys.exit()
                else:
                    print("Wrong password, try again")
                    quot2 = str(input("do u want to continue "))
                    if quot2 == "N":
                        sys.exit()
        else:
            print("Username dosent match..")

def signup_function():
    while True:
        print("Enter your username")
        x = str(input())
        lolusrnm.append(x)
        y = str(input("Enter your password : " ))
        lolpasswrd.append(y)
        sassy = input("Do you want to (L)ogin? or continue to (S)ign up another account?")
        if sassy == "L":
            login_function()
        elif sassy == "S":
            continue

signup_function()

方案2:使用try-except捕获异常

如果不想调整顺序,可以用异常捕获来处理index()方法抛出的错误:

import sys

lolusrnm = []
lolpasswrd = []

def login_function():
    while True:
        usrnm = str(input("please enter your username : "))
        if usrnm in lolusrnm:
            while True:
                passwrd = str(input("Please enter your password : "))
                chkusrnmindx = lolusrnm.index(usrnm)
                try:
                    chkpasswrdindx = lolpasswrd.index(passwrd)
                except ValueError:
                    print("password dont match try again")
                    continue
                if chkpasswrdindx == chkusrnmindx:
                    print("you are in ")
                    sys.exit()
                else:
                    print("Wrong password, try again")
                    quot2 = str(input("do u want to continue "))
                    if quot2 == "N":
                        sys.exit()
        else:
            print("Username dosent match..")

def signup_function():
    while True:
        print("Enter your username")
        x = str(input())
        lolusrnm.append(x)
        y = str(input("Enter your password : " ))
        lolpasswrd.append(y)
        sassy = input("Do you want to (L)ogin? or continue to (S)ign up another account?")
        if sassy == "L":
            login_function()
        elif sassy == "S":
            continue

signup_function()

方案3:改用字典存储(更推荐)

当前用两个列表存储用户名和密码的方式有隐患:如果两个用户的密码相同,index()会返回第一个匹配的索引,导致账号匹配错误。更合理的方式是用字典,直接将用户名和密码作为键值对存储:

import sys

# 用字典存储用户名和密码,键是用户名,值是密码
user_credentials = {}

def login_function():
    while True:
        usrnm = str(input("please enter your username : "))
        if usrnm in user_credentials:
            while True:
                passwrd = str(input("Please enter your password : "))
                if user_credentials[usrnm] == passwrd:
                    print("you are in ")
                    sys.exit()
                else:
                    print("Wrong password, try again")
                    quot2 = str(input("do u want to continue "))
                    if quot2 == "N":
                        sys.exit()
        else:
            print("Username dosent match..")

def signup_function():
    while True:
        print("Enter your username")
        username = str(input())
        if username in user_credentials:
            print("Username already exists, choose another one")
            continue
        password = str(input("Enter your password : " ))
        user_credentials[username] = password
        sassy = input("Do you want to (L)ogin? or continue to (S)ign up another account?")
        if sassy == "L":
            login_function()
        elif sassy == "S":
            continue

signup_function()

这个版本不仅避免了索引匹配的问题,代码逻辑也更简洁。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:27:01