Python实现Matrix类randomize方法填充矩阵触发IndexError报错咨询
报错触发原因
- 类初始化阶段仅创建了一个没有任何子元素的外层空列表
self.data = [],未按照矩阵的行列结构,为每一行提前创建对应的子列表。 - 执行
self.data[i].append(value)时,第一步需要定位self.data中索引为i的行列表。由于此时外层self.data的长度为0,不存在任何可访问的子元素,访问i索引时直接超出列表合法的索引范围,触发IndexError: list index out of range异常。 - 逻辑偏差点:代码默认
self.data已经预置了与行数匹配的空行结构,但实际初始化流程完全没有完成这部分结构搭建。
代码修复方案
方案1:在randomize循环中补全行结构
在每一轮行循环的起始位置,先为self.data追加一个空的行列表,再往对应行中添加随机数,修改后的完整可运行代码如下:
import random class Matrix: def __init__(self, rows, cols): self.rows = rows self.cols = cols self.data = [] def randomize(self): for i in range(self.rows): # 先初始化当前行的空列表 self.data.append([]) for j in range(self.cols): value = random.randint(0, 10) self.data[i].append(value)
方案2:初始化阶段预置矩阵结构
在__init__方法中提前完成所有空行的创建,从根源上避免后续访问时的索引越界,调整后的代码片段:
# 替换原有的self.data初始化行 self.data = [[] for _ in range(self.rows)]
此时randomize方法不需要额外调整行结构,原有的逐元素append逻辑即可正常运行。
方案3:简化写法一次性构建矩阵
可以通过嵌套列表生成式直接在randomize方法中完成整个随机矩阵的构建,省去逐层append的冗余逻辑:
def randomize(self): self.data = [ [random.randint(0, 10) for _ in range(self.cols)] for _ in range(self.rows) ]
内容的提问来源于stack exchange,提问作者riag abderrahman
相关产品推荐
相关产品推荐

