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

Python实现凯撒密码报str对象不支持项赋值错误如何解决

报错根源

Python中字符串是不可变对象,不支持直接通过索引修改单个字符。你代码里写了list(tempword)但没有把转换结果赋值给变量,tempword从头到尾都是字符串类型,执行赋值操作自然触发TypeError: 'str' object does not support item assignment报错。

除了这个直接触发报错的问题,原代码还有3处逻辑漏洞:

  • 没有做原字符到密文字符的映射,只是按输入字符的位置顺序取caesar列表的对应下标值,不符合凯撒密码位移替换的规则
  • 存在变量名拼写错误,循环内定义的是caeserlet,和外部的caesarlet变量名不一致
  • 末尾的str(tempword)没有赋值接收返回值,类型转换不会实际生效
修复方法
  1. 字符串转列表的结果必须赋值给新变量,列表是可变类型,支持单元素修改
  2. 给每个输入的字母做索引匹配:先计算当前字母在26个小写字母表中的位置,再去你写好的位移3位的caesar映射表里取对应的密文字符
  3. 所有字符替换完成后,用''.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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:12:22