Python两种列表生成式的差异及LeetCode 2373错误原因解析
二维列表两种初始化方式的差异分析
在解决LeetCode 2373题时,两种二维列表初始化方式会产生截然不同的结果,以下是二者的核心差异:
两种初始化代码
错误初始化方式
ans = [[0] * (n-2)] * (n-2)
正确初始化方式
ans = [[0] * (n-2) for _ in range(n-2)]
差异本质
错误方式的问题:该方式先创建一个长度为
n-2的一维列表,然后将这个同一个列表对象重复引用n-2次。也就是说,ans中的每一行指向的都是内存里的同一个列表。修改任意一行的元素时,所有行都会同步变化——因为它们本质上是同一个对象。正确方式的逻辑:通过循环迭代,每次都会创建一个全新的
[0]*(n-2)列表。ans中的每一行都是独立的列表对象,修改其中一行不会对其他行造成影响。
错误代码的问题分析
以下是使用错误初始化方式导致结果错误的解法代码:
class Solution: def largestLocal(self, grid: List[List[int]]) -> List[List[int]]: n = len(grid) ans = [[0] * (n-2)] * (n-2) print(ans) for i in range(n-2): for j in range(n-2): ans[i][j] = max(grid[x][y] for x in range(i, i+3) for y in range(j, j+3)) return ans
在嵌套循环中,每次给ans[i][j]赋值时,实际都是在修改同一个底层列表。比如当i=0时修改ans[0][0],i=1时修改ans[1][0],本质是修改同一个列表的第0个元素。最终ans的所有行都会变成最后一次循环修改的结果,导致返回的二维数组所有行完全相同,与预期结果不符。
内容的提问来源于stack exchange,提问作者Dog Fish
相关产品推荐
相关产品推荐

