You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:05:00