python中声明二维数组的语法区别

问题描述

我尝试在 Python 中编写 0/1 Knapsack 动态编程自底向上方法

我尝试过的代码

def knapSack(W,wt,val,n):
    matrix = [[0]*(W+1)]*(n+1)
    print(matrix)

    for i in range(n+1):
        for j in range(W+1):
            if i == 0 or j == 0:
                matrix[i][j] = 0

            elif wt[i-1] <= j:
                matrix[i][j] = max(val[i-1]+matrix[i-1][j-wt[i-1]],matrix[i-1][j])
                
            else:
                matrix[i][j] = matrix[i-1][j]
                
            
    return matrix[n][W]


def knapSack2(W,n):
    t = [[0 for i in range(W+1)] for j in range(n+1)]
    print(t)

    for i in range(n+1):
        for j in range(W+1):
            if i == 0 or j == 0:
                t[i][j] = 0

            elif wt[i - 1] <= j:
                t[i][j] = max(val[i-1] + t[i-1][j - wt[i-1]],t[i-1][j])
                
            else:
                t[i][j] = t[i-1][j]
                

    return t[n][W]


n = 3
W = 4

wt = [1,2,3]
val = [4,5,1]
print(knapSack(W,n))
print(knapSack2(W,n))

我得到的输出是:

[[0,0],[0,0]]
16
[[0,0]]
9

问题:为什么除了声明之外,两个函数代码完全相同,但输出结果却有所不同?

像这样,即使打印函数值相同,下面的声明也有区别吗?

matrix = [[0]*(W+1)]*(n+1)
matrix = [[0 for i in range(W+1)] for j in range(n+1)]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)