赋值
对于复制的操作,最简单的就是赋值,指的是新建一个对象的引用,新建目标对象与原来的目标对象指向同一个内存地址,因而,始终保持一致。
list1 = [1, 2, 3, 4, 5, [6, 7, 8, ]] list2 = list1 list1.append(9) print(list1) print(list2) list1[5][0] = 10 print(list1) print(list2) list1[5] = 10 print(list1) print(list2)
浅拷贝
浅拷贝顾名思义就是拷贝的比较浅,我们可以把赋值认为是新建了一个对象的引用,把原来被对象内存空间的数据指向新的变量,这时同一块内存空间指向两个变量。浅拷贝与赋值不同,既然是拷贝,那么就是要开辟一块新的内存空间,复制的是原来被拷贝对象内多个元素对象的引用,有几个元素对象就赋值几个元素对象的引用。因此,被浅拷贝对象内的元素改变,会引起浅拷贝对象内元素的改变;被拷贝对象添加元素,拷贝对象不再添加元素(因为没有一个新的引用);被拷贝对象删除元素,拷贝对象也删除元素(元素都已经删了,虽然引用存在,但是并没有什么卵用)。
import copy list1 = [1, 2, 3, 4, 5, [6, 7, 8, ]] list2 = copy.copy(list1) print(list1) print(list2) list1[5].append(9) print(list1) print(list2) list1.append(6) print(list1) print(list2) list1.pop() print(list1) print(list2)
深拷贝
深拷贝其实与浅拷贝有本质的区别,它不会复制任何的引用,对象内的所有元素,子元素,孙子元素,重孙元素,曾孙元素的数据都是由复制而来。它的实现原理就是递归,只要任意元素内仍然有子元素,就会复制子元素的数据放到新的内存地址。既然这样,在使用深拷贝后,被拷贝对象的改变,不会引起拷贝对象的任何改变。
import copy list1 = [1, 2, 3, 4, 5, [6, 7, 8, ]] list2 = copy.deepcopy(list1) print(list1) print(list2) list1[5].append(9) print(list1) print(list2) list1.append(6) print(list1) print(list2) list1.pop() print(list1) print(list2)
总结:
- 赋值:新建一个原来对象内存地址的引用,不开辟新的内存空间;
- 浅拷贝:新建多个原来对象内一级子元素内存地址的引用,开辟新的内存空间;
- 深拷贝:复制原来对象内的所有N级子元素的数据,开辟新的内存空间。