关于创建列表方式的一个疑问

2020-07-13 16:55:38 +08:00
 18870715400

今天在做动态规划的时候创建二维列表的时候发现了一个疑问, 代码如下

def func(N, total_weight):
    weight = [1, 2, 3, 4]
    value = [2, 4, 4, 5]
    dp = [[0 for i in range(total_weight+1)] for j in range(N+1)]
    print(dp)
    # dp = [[0] * (total_weight + 1)] * (N+1)
    # print(dp)
    for i in range(1, N + 1):
        for j in range(1, total_weight + 1):
            if j >= weight[i - 1]:
                value1 = dp[i - 1][j - weight[i - 1]] + value[i - 1]
                dp[i][j] = max(value1, dp[i - 1][j])
            else:
                dp[i][j] = dp[i - 1][j]
    return dp

func(4, 6)

dp = [[0 for i in range(total_weight+1)] for j in range(N+1)] 创建的列表和 dp = [[0] * (total_weight + 1)] * (N+1)创建的列表完全相同, 但是最后两者得到的结果完全不同, 前者使用 for 循环得到的结果最后是正确的, 为什么会这样呢???

for 循环得到的列表值: [[0, 0, 0, 0, 0, 0, 0], [0, 2, 2, 2, 2, 2, 2], [0, 2, 4, 6, 6, 6, 6], [0, 2, 4, 6, 6, 8, 10], [0, 2, 4, 6, 6, 8, 10]]

直接乘号得到的列表值: [[0, 2, 4, 6, 8, 10, 12], [0, 2, 4, 6, 8, 10, 12], [0, 2, 4, 6, 8, 10, 12], [0, 2, 4, 6, 8, 10, 12], [0, 2, 4, 6, 8, 10, 12]]

1180 次点击
所在节点    Python
2 条回复
pwli
2020-07-13 17:09:43 +08:00
后者是浅拷贝,也就是说列表内的元素(另一个列表)指向同一个地址
18870715400
2020-07-13 17:13:05 +08:00
@pwli 刚尝试了一下, 的确是这样, 谢谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/689643

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX