美文网首页程序员
Python:二维列表的定义

Python:二维列表的定义

作者: 陈某君 | 来源:发表于2019-12-06 11:28 被阅读0次

    写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:二维列表的定义

        本文链接:https://www.haomeiwen.com/subject/uuwsgctx.html