## 针对数字、字符串这种类型,没有所谓的深浅拷贝
a = 10
b = copy.copy(a) ##浅拷贝
c = copy.deepcopy(b) ##深拷贝
print(id(a))
print(id(b))
print(id(c))
浅拷贝,就是只拷贝普通的成员,改变普通成员
1、浅拷贝
1 浅拷贝---- 普通列表就是各改变各自的成员!但是列表的列表改变,拷贝前后会相互影响
import copy 2 l = [1,2,3,4,[1,3,4]] 3 l2 = copy.copy(l) 4 #l2[0]=100 5 #print(l2) ##输出:[100, 2, 3, 4, [1, 3, 4]] ##新的列表和旧的列表指向同一地址(还是原来的列表),但是数值是不可变的,所以新列表的改变 6 #print(l) #输出:[1, 2, 3, 4, [1, 3, 4]] ## 不会影响到就的列表。。。l2改变的它的引用,l并没有改变 7 8 print('------------') 9 l2[4][0]=100 10 print(l) #输出:[1, 2, 3, 4, [100, 3, 4]] 因为新的列表的原来的列表指向的都是同一列表(列表是可修改的),所以都会改变!! 11 print(l2) #输出:[1, 2, 3, 4, [100, 3, 4]]
2、深拷贝
1 ## 深拷贝-- 两个列表都不会相互影响!!列表中的普通元素改变,只是改变了变量的指向(引用);但是列表中的列表是新的列表,所以不会影响 2 l = [1,2,3,4,[1,3,4]] 3 l2 = copy.deepcopy(l) 4 #l2[0]=100 5 #print(l2) ## 输出:[100, 2, 3, 4, [1, 3, 4]] 6 #print(l) ## 输出:[1, 2, 3, 4, [1, 3, 4]] 7 print('------------') 8 l2[4][0]=100 9 print(l) ##输出:[1, 2, 3, 4, [1, 3, 4]] 10 print(l2) ##输出:[1, 2, 3, 4, [100, 3, 4]]
3
1 # 针对于数字、字符串这种类型,是没有所谓的深浅拷贝的 2 import copy 3 4 ##浅拷贝 copy 5 ##简单的来说只可拷贝对象的父级元素 6 7 ##深拷贝 deepcopy 8 ##简单的说是递归拷贝所有元素 9 ''' 10 主要分为两种情况: 11 1、纯列表:l = [1,2,3,4,5] 12 无论是浅拷贝还是深拷贝,拷贝完都是三个全新的列表,互相之间没有影响 13 2、不纯列表:l =[1,2,3,[7,8,9]] 14 (1)若是浅拷贝,产生的新列表,和原来旧列表共用l[3]!!意思是新旧列表l[3]指向的是同一内存地址 15 假设改变旧的l[3]或者新的l[3],他们之间相互影响!! 16 (2)若是深拷贝,产生的新旧列表都是不同的内存地址!!互相不会影响 17 18 从更深的内存地址讲: 19 id输出!!这里不在赘述! 20 ''' 21 22 l = [1, 2, 3, 4, 5, 6] 23 l1 = copy.copy(l) 24 l.append(100) 25 print(l) # [1, 2, 3, 4, 5, 6, 100] 26 print(l1) # [1, 2, 3, 4, 5, 6] 27 28 l2 = copy.deepcopy(l) 29 l.append(100) 30 print(l) # [1, 2, 3, 4, 5, 6, 100] 31 print(l2) # [1, 2, 3, 4, 5, 6] 32 33 print('------------------s') 34 ll = [1, 2, 3, 4, [1, 2, 3, 4]] 35 ll1 = copy.copy(ll) 36 ll[4][0] = 100 37 print('ll=', ll) ##ll= [1, 2, 3, 4, [100, 2, 3, 4]] 38 print('ll1=', ll1)##ll1= [1, 2, 3, 4, [100, 2, 3, 4] 39 40 ll2 = copy.deepcopy(ll) 41 ll[4][0] =100 42 print('ll=',ll) ##ll= [1, 2, 3, 4, [100, 2, 3, 4]] 43 print('ll2=',ll2) ##ll2= [1, 2, 3, 4, [1, 2, 3, 4]]
有生之年,只诉衷肠不言殇.....