Python实现凯撒密码报str对象不支持项赋值错误如何解决
报错根源
Python中字符串是不可变对象,不支持直接通过索引修改单个字符。你代码里写了list(tempword)但没有把转换结果赋值给变量,tempword从头到尾都是字符串类型,执行赋值操作自然触发TypeError: 'str' object does not support item assignment报错。
除了这个直接触发报错的问题,原代码还有3处逻辑漏洞:
- 没有做原字符到密文字符的映射,只是按输入字符的位置顺序取caesar列表的对应下标值,不符合凯撒密码位移替换的规则
- 存在变量名拼写错误,循环内定义的是
caeserlet,和外部的caesarlet变量名不一致 - 末尾的
str(tempword)没有赋值接收返回值,类型转换不会实际生效
修复方法
- 字符串转列表的结果必须赋值给新变量,列表是可变类型,支持单元素修改
- 给每个输入的字母做索引匹配:先计算当前字母在26个小写字母表中的位置,再去你写好的位移3位的caesar映射表里取对应的密文字符
- 所有字符替换完成后,用
''.join()方法把列表拼接成完整的密文字符串再输出
修复后可直接运行的代码
# 位移3位的凯撒密码映射表,索引0对应a替换为x、1对应b替换为y,依次类推 caesar = [ "x", "y", "z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w" ] tempword = input('What would you like to encrypt? ') word_list = list(tempword) for idx in range(len(word_list)): current_char = word_list[idx].lower() # 只处理字母,非字母内容保持原样 if current_char.isalpha(): # 计算当前字母在字母表的索引值,ord('a')返回97,所以a对应0、b对应1...z对应25 char_pos = ord(current_char) - ord('a') word_list[idx] = caesar[char_pos] encrypted_result = ''.join(word_list) print('Done encrypting, your word is: ', encrypted_result)
如果需要支持大写字母加密、调整位移位数,只需要在判断字母的分支里补充大小写判断、调整caesar映射表的排列顺序即可。
内容的提问来源于stack exchange,提问作者zoid_
相关产品推荐
相关产品推荐

