标签:查看 变量 python 技术分享 做了 pen 其他 append 51cto
拷贝分为:赋值,浅拷贝,深拷贝,拷贝程度一次递增
赋值:
赋值就是相当于做了个软连接,所以不管你是修改了链接文联的内容还是源文件的内容,这个文件都会有所改变(相当于镜子里的自己).
浅拷贝:
只是做了部分的拷贝,何谓部分拷贝?就是在赋值的基础上减去了列表最外层的链接,其他的和赋值基本一样,下面例子会有说明.
深拷贝:
相当于把文件复制了一份,新文件或老文件的改变都是互不相干的,完全独立于老文件.
1.先从id来分析:
import copy a = [1,2,3,[4,5,6,[7,8,9]]] b = a c = copy.copy(a) d = copy.deepcopy(a) print('查看每个变量的id') print(id(a)) print(id(b)) print(id(c)) print(id(d))
有上面的结果可以得出,赋值的id是和原来的id是一样的,赋值只是把指针指向了列表a
深拷贝和浅拷贝的id是不一样的,由此看出,深浅拷贝是分别独立开辟出了一个内存空间了
2.在列表中增加元素来看看效果:
①赋值和原列表的比较
import copy a = [1,2,3,[4,5,6,[7,8,9]]] b = a c = copy.copy(a) d = copy.deepcopy(a) print('这个是最初的列表') a.append('aaa') a[3].append('aaa') a[3][3].append('aaa') print('原列表a',a) print('这个是赋值') b.append('bbb') b[3].append('bbb') b[3][3].append('bbb') print('原列表a',a) print('赋值列表b',b)
所以赋值列表,无论是原列表增加还是赋值列表增加都会增加
②.浅拷贝和原列表的比较:
import copy a = [1,2,3,[4,5,6,[7,8,9]]] b = a c = copy.copy(a) d = copy.deepcopy(a) print('这个是最初的列表') a.append('aaa') a[3].append('aaa') a[3][3].append('aaa') print('原列表a',a) print('这个是浅拷贝') c.append('ccc') c[3].append('ccc') c[3][3].append('ccc') print('原列表a',a) print('浅拷贝列表c',c)
由此可得出的结论是浅拷贝和原列表深层元素相当于赋值,最外层元素,相当于深拷贝,浅拷贝是赋值和深拷贝的中间产物
③.深拷贝和原列表的比较:
有上面的例子得出,深拷贝和浅拷贝是互不相关的,各自都对对方没有影响!
标签:查看 变量 python 技术分享 做了 pen 其他 append 51cto
原文地址:http://blog.51cto.com/853056088/2156686