一、引言—Python赋值
例:
注:
1)id()函数用来查看对象的内存地址。
2)a[4]是一个嵌套的列表。
3)变量b与a的内存地址相同。
Python赋值操作:
赋值后新变量的内存地址并没有发生变化,Python中的赋值操作不会开辟新的内存空间,只是复制了新对象的引用。修改a值影响b值,修改b值影响a值。
二、Python浅拷贝
语法如下:
import copy
c=copy.copy(a)
例:
注:
1)接上例。
2)浅拷贝只是复制了对象的引用,内存地址发生变化。
3)对象的元素地址相同,a和c理论上是两个对象,修改c值不会影响a值。
4)浅拷贝只拷贝一层,对于嵌套的list,修改c值会影响a值。
Python浅拷贝小结:
1、浅拷贝是对引用的拷贝,只拷贝父对象,所以上例中id(c)≠id(a)。
2、对象内部的资源依然是引用,所以上例中id(a[0])=id(c[0]),id(a[4])=id(c[4])。
3、如有嵌套元素,修改浅拷贝后的值,原始变量同时也被修改。
三、Python深拷贝
语法如下:
d=copy.deepcopy(a)
深拷贝拷贝了对象的所有元素,包括嵌套的元素,因此其时间和空间的开销更多一些。
例:
注:
1)接上例。
2)深拷贝是对对象资源的拷贝,id(d)≠id(a),内部id(d[0])=id(a[0]),id(d[4])≠id(a[4])
3)深拷贝拷贝出来的对象是一个全新的对象,与原来的对象不再有任何关联。
Python深拷贝小结:
1、深拷贝是对对象资源的拷贝,它的id不等于原始对象的id。
2、它的内部资源,如果没有嵌套,id相同;如果有嵌套,id不同。
四、Python浅拷贝与深拷贝区别
1、无论浅拷贝还是深拷贝,id(a[0])=id(c[0]),id(d[0])=id(a[0])。
2、对于嵌套元素,如果是深拷贝,id会变,id(d[4])≠id(a[4];如果是浅拷贝,id不会变。
后记:下一篇文章介绍Python深拷贝的应用。
网友评论