这个代码实现这个目的为什么不对
count = 0ju = [*n]*m
for i in indices:
for j in range(n):
ju] = 1+ju]
for k in range(m):
ju] = 1+ju]
给你一个 m x n 的矩阵,最开始的时候,每个单元格中的值都是 0。
另有一个二维索引数组 indices,indices = 指向矩阵中的某个位置,其中 ri 和 ci 分别表示指定的行和列(从 0 开始编号)。
对 indices 所指向的每个位置,应同时执行下述增量操作:
ri 行上的所有单元格,加 1 。
ci 列上的所有单元格,加 1 。 这段代码的目的是对给定的矩阵进行增量操作,对indices数组中指定的位置进行操作,将该位置所在行和列的所有单元格的值加1。
然而,这段代码实现的方式是有问题的。问题出在对二维数组ju的初始化上。在这段代码中,使用了如下的方式初始化二维数组ju:
ju = [*n]*m
这种方式会导致ju矩阵中的每一行其实都是同一个列表对象的引用。也就是说,当对ju[ i]进行修改时,实际上会同时修改所有行的第j列的值。
这是因为使用*n创建的列表是可变的,当将其复制给m个元素时,实际上是将同一个列表对象的引用复制了m次。所以,当对其中一个引用进行修改时,其他引用也会受到影响。
为了解决这个问题,我们可以使用列表推导式来正确初始化ju矩阵,如下所示:
ju = [ for _ in range(m)]
这种方式会创建m个独立的列表对象,每个列表对象都有自己的内存空间,互相之间不会相互影响。
修复了初始化问题后,这段代码就能正确地对矩阵进行增量操作了。
页:
[1]