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

Python中使用列表元素作为SBOX坐标时出现TypeError: 'int' object is not subscriptable错误的问题咨询

问题排查与修复方案

首先,咱们直接定位你遇到的TypeError: 'int' object is not subscriptable错误:
在你第一个嵌套循环里,这段代码:

for a in range(0,4):
    for b in range(0,4):
        Text[a][b] = ( int( ord(Text[a][b])) ^int(Cle[a][b]))

把Text里原本的字符串元素(比如"B")转换成了整数(比如64)。后面你尝试执行x = (Text[i][m][0])时,相当于对一个整数做下标访问——整数没有下标属性,自然就报错了。

接下来我们一步步修复代码,实现你通过坐标遍历SBOX的需求:

1. 修复数据类型问题:将整数转为两位十进制字符串

因为你需要用每个值的十位和个位作为SBOX的行、列索引,所以得把异或后的整数转成固定两位的字符串(不足两位补0,比如37变成"37",4变成"04")。修改第一个循环:

for a in range(0,4):
    for b in range(0,4):
        # 计算异或结果,转为两位字符串(补前导0)
        xor_result = int(ord(Text[a][b])) ^ int(Cle[a][b])
        Text[a][b] = f"{xor_result:02d}"

2. 修复Texte的初始化与赋值语法错误

你当前的Texte是空列表,而且Texte(i)[m]是错误的调用语法(列表不能用括号调用)。我们需要先初始化一个和Text结构一致的二维列表,再逐个赋值:

# 初始化Texte为4x4的空列表
Texte = [[None for _ in range(4)] for _ in range(4)]
for i in range(0,4):
    for m in range(0,4):
        # 现在Text[i][m]是两位字符串,可以正常取下标
        x = Text[i][m][0]
        y = Text[i][m][1]
        # 用x和y作为SBOX的索引,赋值给Texte
        Texte[i][m] = SBOX[int(x)][int(y)]

3. 调整Affichage函数的输出(可选优化)

因为现在Texte里的元素是短字符串(比如"77"),你可以调整Affichage里的格式化方式,让输出更整洁:

def Affichage(TextAffichage):
    print('[[', '],\n['.join([','.join(["'{:2}'".format(item) for item in row]) for row in TextAffichage]))
    print("]],\n]")

完整修复后的代码

Text = [ ["B","o","n","j"], ["o","u","r"," "], ["ç","a","v","a"], ["b","i","e","n"], ]
Cle = [ ['2','5','6','7'], ['9','3','1','5'], ['7','1','7','8'], ['8','4','3','0'], ]

# 修复:异或后转为两位字符串
for a in range(0,4):
    for b in range(0,4):
        xor_result = int(ord(Text[a][b])) ^ int(Cle[a][b])
        Text[a][b] = f"{xor_result:02d}"

def Affichage(TextAffichage):
    print('[[', '],\n['.join([','.join(["'{:2}'".format(item) for item in row]) for row in TextAffichage]))
    print("]],\n]")

Affichage(Text)
print("*"*30)

# Substitution of the text with a data box de in decimal base
SBOX = [
    ['77', '23', '4', '34', '26', '34', '81', '70', '26', '86'],
    ['64', '96', '66', '28', '4', '2', '21', '90', '79', '83'],
    ['25', '13', '60', '63', '82', '36', '86', '69', '43', '17'],
    ['13', '80', '21', '62', '80', '92', '62', '9', '69', '40'],
    ['21', '76', '90', '10', '28', '32', '21', '33', '18', '56'],
    ['73', '50', '56', '53', '1', '7', '96', '52', '59', '98'],
    ['13', '80', '98', '90', '19', '30', '35', '52', '10', '55'],
    ['23', '85', '57', '42', '64', '50', '30', '92', '74', '86'],
    ['79', '4', '60', '50', '26', '76', '78', '55', '14', '32'],
    ['76', '43', '89', '12', '36', '49', '23', '28', '64', '37']
]

# 修复:初始化Texte并正确赋值
Texte = [[None for _ in range(4)] for _ in range(4)]
for i in range(0,4):
    for m in range(0,4):
        x = Text[i][m][0]
        y = Text[i][m][1]
        Texte[i][m] = SBOX[int(x)][int(y)]

# 输出替换后的结果
Affichage(Texte)

这样运行后,就不会再出现类型错误,而且能正确通过每个值的十位和个位索引SBOX完成替换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:07:37