python二维数组操作踩坑及深浅拷贝

在用python刷动态规划题目的时候,需要用到二维数组,
然后进行这样的操作创造一个4x3的二维数组 dp = [[0]*3]*4,然后想修改第一行第一列的值dp[0][0] = 1, 发现第一列所有的值都变成1
在这里插入图片描述
然后翻阅了其他的博客发现,list * n—>n shallow copies of list concatenated, n个list的浅拷贝的连接。在此简述一下复制、浅拷贝和深拷贝的区别。

  • 复制就是传递对象的引用,给对象多取个名字,原始对象改变,各个变量也会跟着改变

  • 浅拷贝就是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制。
    所以在上面二维数组的构造中,嵌套中的列表只是拷贝了第一个嵌套列表的引用,并没有。像上图中dp[0][0] = 1 , dp第一列的所有值都变成1。 就是说列表中嵌套着可变对象(包括列表,字典)的话,list[index]就是它们的引用。
    在这里插入图片描述

  • 深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制
    在这里插入图片描述
    所以需要另外一种方式创建多维数组,以免浅拷贝

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值