Python学习日记(六) 浅深copy

时间:2023-03-10 06:27:11
Python学习日记(六) 浅深copy

浅深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]]