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

Python向列表指定索引存值触发IndexError索引越界错误

报错原因定位

触发索引越界的直接原因和代码中存在的其他逻辑问题如下:

  • 空列表直接按索引赋值:你初始化的arr = []是长度为0的空列表,Python列表不支持对不存在的索引位置直接赋值,必须通过append()追加元素,或提前初始化对应长度的列表,arr[i] = ...这行代码直接触发越界报错。
  • 数组切片维度顺序错误:OpenCV读取的图片NumPy数组维度顺序为(高度, 宽度, 通道数),你写的切片逻辑把宽高轴顺序写反,切出来的分片尺寸、位置完全错误。
  • 循环和坐标更新逻辑混乱:三层遍历像素的for循环完全没有必要,且坐标更新存在多处错误:initialw = initialw + initialw运算结果永远为0,initialh = initialh + initial中的initial变量从未定义,会触发名称错误;步长累加逻辑放在最内层循环,会导致分片坐标计算完全错乱。
  • 重复IO操作:同时用PIL和OpenCV读取两次同一张图片,属于冗余操作。
正确实现代码

以下代码实现将图片均匀切分为2行2列共4个分片,所有分片存入列表后可直接通过索引调取:

import cv2
import numpy as np

# 读取原始图片
oriImg = cv2.imread('topsecret1.jpg')
# 直接从NumPy数组获取原图宽高,无需额外用PIL读取
img_height, img_width = oriImg.shape[:2]

# 计算单个分片的尺寸,4分片为2行2列排布
tile_height = img_height // 2
tile_width = img_width // 2

tiles = []
# 按行、列顺序切分
for row in range(2):
    for col in range(2):
        # 计算当前分片的坐标范围,兼容原图尺寸不能被2整除的边缘场景
        y1 = row * tile_height
        y2 = (row + 1) * tile_height if row != 1 else img_height
        x1 = col * tile_width
        x2 = (col + 1) * tile_width if col != 1 else img_width
        
        # 切片获取分片,注意第一个维度对应高度方向(y轴),第二个对应宽度方向(x轴)
        current_tile = oriImg[y1:y2, x1:x2]
        tiles.append(current_tile)

# 调用示例:通过索引取出第0个分片(左上块)显示
cv2.imshow("tile 0", tiles[0])
cv2.waitKey(0)
cv2.destroyAllWindows()

代码说明:最终tiles列表长度为4,索引0-3分别对应左上、右上、左下、右下四个分片,可直接通过tiles[索引]的方式获取对应分片开展后续处理。如果需要调整切分方式(比如横向切为4个长条),只需要修改行列循环数和分片尺寸计算逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:51:17