一、定制网站首先和浅拷贝都是对原定制网站对象的拷贝,定制网站都会生成一个看起来相同的对象,定制网站本质区别就是拷贝出来的对象的「地址」定制网站是否与原对象一样,定制网站即就是定制网站对原对象的地址的拷贝,定制网站还是值的拷贝
深拷贝:对原对象的地址的拷贝,定制网站新拷贝了一份与原对象定制网站不同的地址的对象,修改对象中的任何值,都不会改变深拷贝的对象的值。
:对原对象的值的拷贝,地址仍是一个指针指向原对象的地址,浅拷贝或者原对象的值发生变化,那原对象和浅拷贝对象的值都会随着被改变。
浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用
深拷贝(深度克隆):不仅复制对象的基本类,同时也复制原对象的对象,完全是新对象产生的
1.copy.copy 浅拷贝——只拷贝对象,不会拷贝对象的引用对象,不会拷贝原始对象的内部的
2.copy.deepcopy 深拷贝——拷贝对象的值类型,还拷贝了原始对象,而产生了一个新的对象,不仅仅只拷贝了原始对象的引用
二、补充概念:可变对象,不可变对象
可变对象:一个对象在不改变其所指向的地址前提下,可以修改其所执行的地址中的值
不可变对象:一个对象所指向的地址上的值是不能修改的,如果修改了就是它执行的地址就改变了,相当于将这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了。
区别:可变对象就不会这样会修改值后另存到一个新的地址上,而是直接再原对象的地址上把值给改变了,这个对象依然执行这个地址
本质区别:可变对象修改了值,不会新建一个内存地址的对象,不可变对象如果修改了值,及时复制了一份新的内存地址,原始地址的值不会被改变。
不可变元素包含:int,float,complex,long,str,unicode,tuple
可变原生:list
例子:
- import copy
- a = [1, 2, 3, 4, ['a', 'b']]
- b = a #赋值,传对象的引用
- c = copy.copy(a) #浅拷贝,对象拷贝
- d = copy.deepcopy(a) #深拷贝,对象拷贝
-
- a.append(5) #修改对象a,列表末尾添加数字5
- a[4].append('c') #修改对象a中的列表['a', 'b']
-
- print 'a= ', a
- print 'b= ', b
- print 'c= ', c
- print 'd= ', d
-
- 输出结果:
- a = [1, 2, 3, 4, ['a', 'b', 'c'], 5] #修改了原始对象,变为修改后的列表
- b = [1, 2, 3, 4, ['a', 'b', 'c'], 5] #对象的引用,对象的任何值变化都随着变化
- c = [1, 2, 3, 4, ['a', 'b', 'c']] #浅拷贝,不可变元素不能改变,可变元素随着原始对的变化而变化了
- d = [1, 2, 3, 4, ['a', 'b']] #深拷贝,原始对象的值发生任何变化,深拷贝新的对象内存地址不会发生任何变化
参考: