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

使用列表实现随机密码生成器时遇IndexError错误求助

解决随机密码生成器的IndexError问题

问题说明

尝试用列表实现随机密码生成器时,运行代码触发IndexError: pop index out of range错误。

原代码

import random

pe = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '=',
'+', '[', ']', '{', '}', ';', ':', "'", '', '"', '', '|', '/',
'<', '>', ',', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

letter_1 = random.randint(0, pe.__len__())
letter_2 = random.randint(0, pe.__len__())
letter_3 = random.randint(0, pe.__len__())
letter_4 = random.randint(0, pe.__len__())
letter_5 = random.randint(0, pe.__len__())
letter_6 = random.randint(0, pe.__len__())
letter_7 = random.randint(0, pe.__len__())
letter_8 = random.randint(0, pe.__len__())
letter_9 = random.randint(0, pe.__len__())
letter_10 = random.randint(0, pe.__len__())
letter_11 = random.randint(0, pe.__len__())
letter_12 = random.randint(0, pe.__len__())

print(pe.pop(letter_1)  + pe.pop(letter_2) + pe.pop(letter_3) + pe.pop(letter_4) + pe.pop(letter_5) + pe.pop(letter_6) + pe.pop(letter_7) + pe.pop(letter_8) + pe.pop(letter_9) + pe.pop(letter_10) + pe.pop(letter_11) + pe.pop(letter_12))

错误信息

Traceback (most recent call last):
File "c:\Users\Syed Abdul-Muqeet\OneDrive\Desktop\Files\Coding\Python_Programs\Password generator.py", line 25, in <module>
    pe.pop(letter_11) + pe.pop(letter_12))
    ^^^^^^^^^^^^^^^^
IndexError: pop index out of range

错误原因

  1. 索引范围错误:random.randint(a, b)是闭区间取值,会包含a和b。而列表的索引范围是0到len(pe)-1,当你用pe.__len__()作为上限时,可能生成等于列表长度的索引,这个索引超出了列表的有效范围。
  2. 列表长度动态变化:每次调用pe.pop()都会删除列表中的一个元素,导致列表长度逐渐缩短。你提前生成的12个索引都是基于原列表长度的,后续pop操作后列表长度变小,之前的大索引自然就超出了当前列表的有效范围。

修复方案

方案1:允许重复字符的密码

直接使用random.choice()随机选择元素,不需要修改原列表,避免索引问题:

import random

pe = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '=',
'+', '[', ']', '{', '}', ';', ':', "'", '', '"', '', '|', '/',
'<', '>', ',', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

# 生成12位允许重复的密码
password = ''.join([random.choice(pe) for _ in range(12)])
print(password)

方案2:不允许重复字符的密码

如果需要密码中字符不重复,使用random.sample()直接从列表中选取指定数量的不重复元素,比手动pop更简洁安全:

import random

pe = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '=',
'+', '[', ']', '{', '}', ';', ':', "'", '', '"', '', '|', '/',
'<', '>', ',', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

# 生成12位无重复字符的密码
password = ''.join(random.sample(pe, 12))
print(password)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 01:21:00