深浅copy
1对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。
l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1,id(l1)) # [111, 2, 3, ['barry', 'alex']] 112431152 print(l2,id(l2)) # [111, 2, 3, ['barry', 'alex']] 112431152 l1[3][0] = 'wusir' print(l1,id(l1)) # [1, 2, 3, ['wusir', 'alex']] 112431152 print(l2,id(l2)) # [1, 2, 3, ['wusir', 'alex']] 112431152
2对于浅copy(copy)来说,只是在内存中重新创建了开辟了一个空间存放一个新列表(内存地址不同),但是新列表中的元素与原列表中的元素是公用的,即元素的内存地址是相同的。
l1 = [1, '太白', True, (1,2,3), [22, 33]] l2 = l1.copy() print(id(l1), id(l2)) # 112496688 112475312 print(id(l1[-2]), id(l2[-2])) #35243432 35243432 print(id(l1[-1]),id(l2[-1])) #112410096 112410096
3.对于深copy(deepcopy)来说,列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的。
import copy l1 = [1, 'alex', True, (1,2,3), [22, 33]] l2 = copy.deepcopy(l1) # print(id(l1), id(l2)) # 112627760 112606384 print(id(l1[0]),id(l2[0])) # 1521669168 1521669168 print(id(l1[-1]),id(l2[-1])) # 112999960 112999880 #元素为列表 为不可哈希(可变类型) print(id(l1[-2]),id(l2[-2])) # 6735272 6735272