Python:二维列表的定义

写Leetcode的时候突然出现的一个错误,想要记录一下,也不知道起个什么标题好,所有随便起了一个大概相关的标题

以Leetcode的题目开始引入

Leetcode的第72题

image.png

下面是解法(Python)

# 动态规划
# 具体看leetcode讲解
# 注意里面dp定义的细节
class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        n = len(word1)
        m = len(word2)

        if n*m == 0:
            return n+m
        
        # 下面两种dp定义,第一种定义是错的,因为列表内的元素id都相同
        # dp = [[0] * (m+1)] * (n+1)
        dp = [ [0] * (m + 1) for _ in range(n + 1)]
        for i in range(n+1):
            dp[i][0] = i
        for j in range(m+1):
            dp[0][j] = j
        
        for i in range(1, n+1):
            for j in range(1, m+1):
                left = dp[i][j-1] + 1
                down = dp[i-1][j] + 1
                left_down = dp[i-1][j-1]
                if word1[i-1] != word2[j-1]:
                    left_down += 1
                dp[i][j] = min(left, down, left_down)
        return dp[-1][-1]

代码中列表定义的区别

看代码注意到dp = [[0] * (m+1)] * (n+1)dp = [ [0] * (m + 1) for _ in range(n + 1)]是不一样的,两种答案不同,后者才是我们想要的答案,那么为什么会出现这种不同呢?

通过一个简单的例子来看看

image.png

我们发现不同元素的id是一样的,即它们都指向同一个内存地址。


image.png

结论

dp = [[0] * (m+1)] * (n+1)dp = [ [0] * (m + 1) for _ in range(n + 1)]打印出来一样,但前者是列表里面n+1个元素都是指向同一个内存地址,后者是不同的内存地址。所以,建议定义二维列表的时候用列表生成式

你可能感兴趣的:(Python:二维列表的定义)