python二维矩阵:False for _ in range(n)

本文通过一个实际的LeetCode问题探讨了Python中二维数组初始化的常见错误。作者在尝试解决最长回文子串问题时,遇到了因二维数组初始化方式不当导致的逻辑错误。通过对比两种初始化方法——使用`for`循环和直接乘法操作,揭示了直接乘法初始化可能导致的赋值问题,并给出了使用`numpy`库的解决方案。文章强调了在Python中正确初始化二维数组的重要性,以及在数值计算场景下`numpy`库的高效应用。

今天在刷leetcode05的时候,对照着别人运行正常的代码,代码翻来覆去敲了N遍,逻辑捋了N遍,都是一致的,但结果就是不正确。根据结果倒推print出来了错误输出的地方,但还是搞不清为什么会出错。

最后完全复制了一遍,自己改一行,测一次。终于发现,确实不是逻辑问题,而是二维数组初始化的问题。

二维数组初始化的时候,赋值语句有问题。

我用的代码是:

1:dp = [[False]*size]  *size

正确输出用的代码是:

2:  dp = [[False for _ in range(size)] for _ in range(size)]

对比发现,1的语句无法正确赋值,而2可以:

比如:

size = 2
dp1 = [[False]*size]  *size
dp2 = [[False for _ in range(size)] for _ in range(size)]

print(dp1)
print(dp2)
#两者此时的输出结果看起来一样: [[False, False], [False, False]]

dp1[0][1]=True
dp2[0][1]=True

print(dp1)
#dp1 输出为 [[False, True], [False, True]]
print(dp2)
#dp2 输出为 [[False, True], [False, False]]

可以看到for in range 方法生成的二维数组赋值结果是正确的,直接乘出来的数组,赋值时,不是期待的结果。

python中二维数组

查了一下,python中二维数组广泛使用的方法,除了上面的1,2之外就是使用numpy库的函数:

numpy是数值计算,在本题中,可以将false设为0 ,True设为1,其余代码可以不变:

import numpy as np
dp = 
在这段代码中,`matrix = [[0 for _ in range(3)] for _ in range(3)]` 的主要功能是创建一个 3 行 3 列的二维列表(即嵌套列表),也就是一个 **3×3 的零矩阵**。以下是对其具体功能和作用的详细分析: ### 功能解析 - **整体结构:** 这是一个**列表推导式嵌套列表推导式**,用于生成二维数组(模拟矩阵)。 - **外层列表推导式:** `for _ in range(3)` - 控制行数,执行 3 次,表示要创建 3 行。 - `_` 是占位符变量名,表示我们不关心循环变量的具体值,仅用于控制循环次数。 - **内层列表推导式:** `[0 for _ in range(3)]` - 每次生成一个包含 3 个元素的列表,每个元素都是 `0`,即 `[0, 0, 0]`。 - 表示每一行有 3 列。 - **最终结果:** ```python matrix = [ [0, 0, 0], [0, 0, 0], [0, 0, 0] ] ``` 这就是一个标准的 3×3 零矩阵,常用于数学计算、图像处理、游戏开发等需要初始化矩阵的场景。 ### 在完整代码中的作用 虽然后续代码中并没有使用这个 `matrix` 变量(而是单独定义了 `M` 并进行转置操作),但该行的作用是在程序开始时**初始化一个指定大小的全零矩阵**,为后续可能的矩阵运算提供数据结构基础。它展示了 Python 中如何用简洁的方式构造多维列表。 > ⚠️ 注意:此 `matrix` 在后续代码中未被使用,因此它的作用仅限于“示例性地创建一个零矩阵”,可能是为了演示矩阵初始化方法。 ### 替代写法对比 ```python # 等价的传统 for 循环写法 matrix = [] for i in range(3): row = [] for j in range(3): row.append(0) matrix.append(row) # 或使用 NumPy(更高效) import numpy as np matrix = np.zeros((3, 3)) ``` 但原代码使用列表推导式的方式更加简洁、Pythonic。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

picoasis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值