黎子卿 发表于 2023-11-8 19:50:59

这个代码实现这个目的为什么不对

count = 0
ju = [*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 。

isdkz 发表于 2023-11-8 19:51:52

这段代码的目的是对给定的矩阵进行增量操作,对indices数组中指定的位置进行操作,将该位置所在行和列的所有单元格的值加1。

然而,这段代码实现的方式是有问题的。问题出在对二维数组ju的初始化上。在这段代码中,使用了如下的方式初始化二维数组ju:

ju = [*n]*m

这种方式会导致ju矩阵中的每一行其实都是同一个列表对象的引用。也就是说,当对ju[ i]进行修改时,实际上会同时修改所有行的第j列的值。

这是因为使用*n创建的列表是可变的,当将其复制给m个元素时,实际上是将同一个列表对象的引用复制了m次。所以,当对其中一个引用进行修改时,其他引用也会受到影响。

为了解决这个问题,我们可以使用列表推导式来正确初始化ju矩阵,如下所示:

ju = [ for _ in range(m)]

这种方式会创建m个独立的列表对象,每个列表对象都有自己的内存空间,互相之间不会相互影响。

修复了初始化问题后,这段代码就能正确地对矩阵进行增量操作了。
页: [1]
查看完整版本: 这个代码实现这个目的为什么不对