鱼C论坛

 找回密码
 立即注册
查看: 1299|回复: 1

[已解决]这个代码实现这个目的为什么不对

[复制链接]
发表于 2023-11-8 19:50:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
count = 0
ju = [[0]*n]*m
for i in indices:
    for j in range(n):
         ju[i[0]][j] = 1+ju[i[0]][j]
    for k in range(m):
         ju[k][i[1]] = 1+ju[k][i[1]]
给你一个 m x n 的矩阵,最开始的时候,每个单元格中的值都是 0。

另有一个二维索引数组 indices,indices[i] = [ri, ci] 指向矩阵中的某个位置,其中 ri 和 ci 分别表示指定的行和列(从 0 开始编号)。

对 indices[i] 所指向的每个位置,应同时执行下述增量操作:

ri 行上的所有单元格,加 1 。
ci 列上的所有单元格,加 1 。
最佳答案
2023-11-8 19:51:52
这段代码的目的是对给定的矩阵进行增量操作,对indices数组中指定的位置进行操作,将该位置所在行和列的所有单元格的值加1。

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

ju = [[0]*n]*m

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

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

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

ju = [[0 for _ in range(n)] for _ in range(m)]

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

修复了初始化问题后,这段代码就能正确地对矩阵进行增量操作了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-8 19:51:52 | 显示全部楼层    本楼为最佳答案   
这段代码的目的是对给定的矩阵进行增量操作,对indices数组中指定的位置进行操作,将该位置所在行和列的所有单元格的值加1。

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

ju = [[0]*n]*m

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

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

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

ju = [[0 for _ in range(n)] for _ in range(m)]

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

修复了初始化问题后,这段代码就能正确地对矩阵进行增量操作了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 15:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表