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

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__'的错误了。

但除了这个问题,你的代码还有几个其他的逻辑和语法错误,我一起帮你梳理并修正:

主要错误点梳理

  1. 列表反转的正确方式:如果不想修改原列表f2,可以用切片f2_inv = f2[::-1];如果要原地反转,那就先调用f2.reverse(),然后直接用f2即可,不要接收它的返回值。
  2. 普通列表没有rotate方法:你导入了deque但没把f1转换成双端队列,普通列表是没有rotate方法的,必须先把f1转成deque对象。
  3. muladd函数的逻辑错误:
    • 你遍历f1的元素当作索引去访问f1[j],这完全不符合卷积的计算逻辑;
    • 函数里用了global ans但没有提前定义ans,而且函数没有返回值,导致conv[i]会被赋值为None;
    • 卷积需要的是对应位置元素相乘后求和,而不是每次覆盖ans为单个乘积。
  4. 遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:07:32