在用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]就是它们的引用。
-
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制
所以需要另外一种方式创建多维数组,以免浅拷贝