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

为何Python代换密码代码第18行if语句无法阻止列表索引越界错误

问题原因

  • 列表索引越界判断逻辑错误:Python列表索引从0开始,长度为len(key1)的列表合法索引范围是0 ~ len(key1)-1。你原代码判断if x > len(key1)才重置x为0,当x == len(key1)时就已经超出合法索引范围,会触发报错。你示例中的key1共有22个元素,合法索引最大值是21,当x增加到22时就会触发越界。
  • 存在潜在索引错误:你当前只处理了小写字母,如果读取的文本中包含大写字母、空格、数字、标点等不在alphabet里的字符,alphabet.find(char)会返回-1,后续取alphabet[c]也会触发索引越界。
  • 字符偏移逻辑存在缺陷:你原代码中c>25就直接置0,不符合代换密码的循环偏移要求,比如偏移后值为27,对应字母应该是b而非a。

修正方案

  1. 将索引判断条件改为if x >= len(key1),确保x不会超出合法索引范围
  2. 增加非小写字母的兼容处理,非字母字符保留原字符不做加密
  3. 用模26运算优化偏移逻辑,实现正确的字母循环代换

修正后代码

import string

alphabet = 'abcdefghijklmnopqrstuvwxyz'
# 用with语法读取文件,自动处理文件关闭
with open("MyFile.txt", "r", encoding="utf-8") as file1:
    plain_txt = file1.read()

key1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,7]
x = 0
cipher = []

for char in plain_txt:
    c = alphabet.find(char)
    # 修正索引越界判断
    if x >= len(key1):
        x = 0
    # 仅处理小写字母,其他字符保留原样
    if c != -1:
        c = c + key1[x]
        # 用模26实现正确的循环偏移
        c = c % 26
        char = alphabet[c]
    cipher.append(char)
    x += 1

cipher = "".join(cipher)
print(cipher)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:15:02