首先Python提供了三种赋值方法,最常见的是赋值=、浅拷贝copy.copy()和深拷贝copy.deepcopy()。
赋值是使用等于号(=),可以对一个变量进行赋值,赋值就是创建了对象的一个新的引用,赋值并不会产生一个独立的对象,它只是给原有的数据对象添加一个新的标签。所以当其中的一个标签被改变的时候,数据对象就会发生变化,另一个标签也会随之改变。Python中的赋值都是进行对象的引用传递,即内存地址的传递。
浅拷贝是使用copy.copy(),可以进行对象的浅拷贝,浅拷贝只拷贝对象本身,并不会拷贝对象内部的嵌套对象。对于内部的嵌套对象依然使用原始的引用。
深拷贝使用copy.deepcopy()可以进行对象的深拷贝,深拷贝会拷贝对象本身以及其所有的嵌套对象。因为深拷贝会将被复制的对象完全再复制一遍,所以深拷贝后的对象会作为新个体单独存在,所以,当我们尝试改变原有对象,不会对已经复制出来的新对象产生影响。
下面coding下做个尝试,通过代码理解其中的思想。
首先,可以肯定的是赋值、深浅拷贝都能将传递对象。
还是看代码,我将原对象a添加了一个数字4,我们看运行结果,a,b随之变化,c,d未变化。
当我给对象a中的内嵌对象添加一个元素'c'运行结果如下:a,b随之改变,浅拷贝后的对象c也随之变化,深拷贝还是无动于衷。。。
原因如下:
当我去修改对象a,对象a会变化,对象b因为是赋值过来的,传递的是对象a的内存地址,所以对象b也会随着对象a的变化。
深拷贝是无论怎么改动原来的对象a,深拷贝后的新对象d是不会随之变化的。也就是可以这样理解,深拷贝后的新对象与原对象无关。
我们将对象理解为一个人,赋值就是再完完全全复制出一个新的你,原来的你有什么变化,新的你就会发生什么变化,新旧同步。
浅拷贝就是可变的部分会随原对象变化(列表、字典、集合),不可变的部分(数值、字符串、元组)不会随之变化。
还是拿人举例,不可变的比如血型,可变的比如面容。
浅拷贝出来的新的你,不可变的部分是不会随着原来的你发生变化的,可变的部分会随着原来的你发生变化。
原来的你是A型血了,但是被注入了O型血,新的你还是A型血,原来的你整容了,新的你会随之整容。