为何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。
修正方案
- 将索引判断条件改为
if x >= len(key1),确保x不会超出合法索引范围 - 增加非小写字母的兼容处理,非字母字符保留原字符不做加密
- 用模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
相关产品推荐
相关产品推荐

