Python代码运行报错:'NoneType' object has no attribute '__getitem__' 求助
解决Python代码中的'NoneType' object has no attribute 'getitem'错误
咱们先直接定位最显眼的那个错误——你在这行代码里踩了Python列表方法的坑:
f2_inv = f2.reverse()
list.reverse()是原地修改列表的方法,它的返回值是None,所以f2_inv实际上是个None对象。之后在muladd函数里尝试访问f2_inv[j],自然就会抛出'NoneType' object has no attribute '__getitem__'的错误了。
但除了这个问题,你的代码还有几个其他的逻辑和语法错误,我一起帮你梳理并修正:
主要错误点梳理
- 列表反转的正确方式:如果不想修改原列表
f2,可以用切片f2_inv = f2[::-1];如果要原地反转,那就先调用f2.reverse(),然后直接用f2即可,不要接收它的返回值。 - 普通列表没有
rotate方法:你导入了deque但没把f1转换成双端队列,普通列表是没有rotate方法的,必须先把f1转成deque对象。 muladd函数的逻辑错误:- 你遍历
f1的元素当作索引去访问f1[j],这完全不符合卷积的计算逻辑; - 函数里用了
global ans但没有提前定义ans,而且函数没有返回值,导致conv[i]会被赋值为None; - 卷积需要的是对应位置元素相乘后求和,而不是每次覆盖
ans为单个乘积。
- 你遍历
- 遍历
conv的方式错误:for i in conv是遍历列表的元素(初始都是0),你应该遍历索引来给conv的每个位置赋值,比如用for i in range(len(conv))。
修正后的完整代码
下面是修复所有错误后的代码,实现了两个列表的卷积计算:
from collections import deque def muladd(f1_deque, f2_inv): total = 0 # 遍历对应位置的元素,相乘后累加 for num1, num2 in zip(f1_deque, f2_inv): total += num1 * num2 return total # 初始化原始列表 f1 = [2, 3, 7, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0] f2 = [0, 0, 0, 0, 8, 7, 6, 5, 9, 0, 0, 0, 0] # 正确反转f2,不修改原列表 f2_inv = f2[::-1] # 将f1转为deque以便使用rotate方法 f1_deque = deque(f1) # 初始化卷积结果列表,长度根据卷积规则设置(这里假设是9,你可以根据需求调整) conv = [0] * 9 for i in range(len(conv)): conv[i] = muladd(f1_deque, f2_inv) print(conv[i]) # 对f1_deque进行右旋转1位(如果需要左旋转可以传负数,比如rotate(-1)) f1_deque.rotate(1)
代码修改说明
- 用
f2[::-1]替代f2.reverse(),避免得到None,同时保留原列表f2不变; - 将
f1转换为deque对象,这样就能正常使用rotate方法; - 重写
muladd函数,用zip遍历两个序列的对应元素,计算乘积和并返回结果; - 遍历
conv的索引来赋值,确保每个位置都能正确被计算; - 移除了不必要的
global变量,改用函数返回值的方式传递结果,代码更清晰。
内容的提问来源于stack exchange,提问作者Ganesh Srikantan
相关产品推荐
相关产品推荐

