赋值运算
l1 = [1,2,3,[22,33]] l2 = l1 l1.append('666') print(l1) print(l2)
浅copy
1 l1 = [1,2,3,[22,33]] 2 l3 = l1.copy() #新开辟了一个空间,存放的是对l1 copy出来的列表,内含l1内元素 3 l1.append('666') #l1新增元素不在开辟的空间中 4 l1[-2].append('777') 5 l1[0] = 90 #l1列表的槽位指向了其他的对象,并不会改变copy列表中的对象 6
#l1原元素存放在copy列表中,l1和l3槽位均指向copy出来的列表中的对象内存地址,所以l1和l3的id不同,但是l1和l3内容的id相同 7 print(l3) #[1, 2, 3, [22, 33, '777']] 8 9 print(l1) #[90, 2, 3, [22, 33, '777'], '666']
深copy
1 import copy 2 3 l1 = [1,2,3,[22,33]] 4 l2 = copy.deepcopy(l1) 5 #python对深copy做了优化,将copy列表中,不可变数据类型沿用copy列表,可变数据类型新创建一个(不同id) 6 7 l1.append('666') 8 l1[-1].append(90) 9 10 print(l1) #[1, 2, 3, [22, 33, 90]] 11 print(l2) #[1, 2, 3, [22, 33]]
总结
深copy会在内存中开辟新空间,将原列表以及列表里面的可变的数据类型重新创建一份,不可变的数据类型则沿用之前的
相关面试题
l1 = [1,2,3,[22,33]]
l2 = l1[:] #切片为浅copy l1[-1].append('66') print(l1) #[1, 2, 3, [22, 33, 90, '66']] print(l2) #[1, 2, 3, [22, 33, 90, '66']]