浅深copy即完全复制一份和部分复制一份
浅深copy在列表数据量较大时不建议使用,比较消耗内存资源
1.赋值运算
l1 = [1,'s',[1,2,3]] l2 = l1 print(id(l1),id(l2)) #34103880 34103880 l1[2][1] = 'h' print(id(l1),id(l2)) #34103880 34103880
l1和l2指向的是相同的内存地址
2.浅copy
l1 = [1,'s',[4,5,6,'s','h']] l2 = l1.copy() print(id(l1),id((l2))) #5988936 6475464 print(id(l1[0]),id(l2[0])) #8791394136912 8791394136912 print(id(l1[2][0]),id(l2[2][0])) #8791410914224 8791410914224
浅copy即开辟一个新的内存空间放一个新的列表,但是里面的元素两边都是公用的
3.深copy
import copy l1 = [1,'s',False,(2,3,4),{1,2,3},['a','b']] l2 = copy.deepcopy((l1)) print(id(l1),id(l2)) #42180488 42179272 print(l1,l2) #不可变数据类型 print(id(l1[0]),id(l2[0])) #8791394136912 8791394136912 print(id(l1[1]),id(l2[1])) #37970136 37970136 print(id(l1[2]),id(l2[2])) #8791410383216 8791410383216 print(id(l1[3]),id(l2[3])) #39259880 39259880 #可变数据类型 print(id(l1[4]),id(l2[4])) #42293064 42293512 print(id(l1[5]),id(l2[5])) #42685064 42685192
深copy是开辟一个新的列表内存空间,当列表中有不可变数据类型的元素时则与原列表共用,当列表有可变数据类型的元素时则会重新创建一个内存地址
面试题:
l1 = [1, 2, 3, 4, ['alex']] l2 = l1[::] l1[-1].append(666) print(l2) #[1, 2, 3, 4, ['alex', 666]]