Python:二维列表的定义
2019-12-06 本文已影响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个元素都是指向同一个内存地址,后者是不同的内存地址。所以,建议定义二维列表的时候用列表生成式。