python 对内存的使用 | |
浅拷贝 解释:引用的拷贝(只拷贝父对象); |
深拷贝 解释:对对象资源的拷贝; |
导入模块:
>>> import copy
>>> a = [1,2,3,[‘a‘,‘b‘,‘d‘]] >>> b = a >>> a [1, 2, 3, [‘a‘, ‘b‘, ‘d‘]] >>> b [1, 2, 3, [‘a‘, ‘b‘, ‘d‘]] >>> id(a) 139712705065616 >>> id(b) 139712705065616 #定义二元列表,标签引用,且查看内存地址一致,但不能作为依据
调用copy.copy模块,进行拷贝 浅拷贝
>>> c=copy.copy(a)
观察c的地址空间,通过copy是独立的
>>> c [1, 2, 3, [‘a‘, ‘b‘, ‘d‘]] >>> a [1, 2, 3, [‘a‘, ‘b‘, ‘d‘]] >>> id(c) 139712705068784 #注意 >>> id(a) 139712705065616 #注意
向序列增加值:
>>> a.append(‘d‘) >>> a [1, 2, 3, [‘a‘, ‘b‘, ‘d‘], ‘d‘] >>> b [1, 2, 3, [‘a‘, ‘b‘, ‘d‘], ‘d‘] #b指向的是同一地址空间 >>> c [1, 2, 3, [‘a‘, ‘b‘, ‘d‘]] #c未改变
浅拷贝只拷贝父对象:
>>> id(a[3]) 139712704967456 >>> id(c[3]) 139712704967456 >>> id(a[4]) 139712705357456
#注意上述可变类型的子对象地址空间未改变,
调用copy.deepcopy模块,进行拷贝 深拷贝
>>> d = copy.deepcopy(a)
查看地址空间
>>> id(a) 139712705065616 >>> id(d) 139712705065688 >>> id(a[3]) 139712704967456 >>> id(d[3]) 139712705068640 #此处是不一致的
向序列增加值:
>>> a.append(‘e‘) >>> a [1, 2, 3, [‘a‘, ‘b‘, ‘d‘, ‘d‘], ‘d‘, ‘e‘] >>> d [1, 2, 3, [‘a‘, ‘b‘, ‘d‘, ‘d‘], ‘d‘] >>> a[3].append(‘x‘) >>> a [1, 2, 3, [‘a‘, ‘b‘, ‘d‘, ‘d‘, ‘x‘], ‘d‘, ‘e‘] >>> d [1, 2, 3, [‘a‘, ‘b‘, ‘d‘, ‘d‘], ‘d‘]
对对象资源的拷贝:
>>> id(a[3]) 139712704967456 >>> id(d[3]) 139712705068640 #注意上述可变类型的子对象地址空间发生改变
本文出自 “思想大于技术” 博客,谢绝转载!
原文地址:http://linuxboys.blog.51cto.com/9150052/1658484