python中的拷贝分为深拷贝与浅拷贝
众所周知,python中的数据是采用引用的机制,我们所创建的对象或变量都是被指向一个内存的起始地址。
可变类型和不可变类型的一大区别也就出现在这里。
在这里我们主要讲述对可变类型的拷贝(对不可变类型进行拷贝大多数情况下都没有意义)
我们先设置一个前提
a = 1
b = 2
c = [a,b] # [1,2]
d = [a,b,c] # [1,2,[1,2]]
首先先来介绍下深拷贝
深拷贝是个极其容易理解的概念,一言蔽之,它就是将拷贝目标完完整整,从头到尾的另外生成一份。
使用深拷贝拷贝以上的c和d时,不论原本的c和d如何变动,深拷贝后的新对象都不会改变。
深拷贝会递归的将目标一层一层的拷贝,但这种方式对内存的使用效率并不高,所以在python中大部分拷贝都不是深拷贝。
其次是浅拷贝
浅拷贝相对于深拷贝而言,字面上理解,就知道它拷贝的并不“全”。
那么这个拷贝相较于深拷贝,不全的地方在哪儿呢?
就在递归上。
浅拷贝只会拷贝目标的第一层内存地址,所以一旦目标中嵌套着可变类型时,一旦目标嵌套中的可变类型发生变动后,浅拷贝产生的新对象也会随之发生改变。
在上面的例子中就是:d在拷贝后一旦其中的c改变,浅拷贝产生的新对象中的那一部分(c这个列表中的值)也会改变。