Python开发【第二章】:深浅拷贝剖析
1 #-----python的赋值,浅copy,深copy----- 2 #总结:直接赋值即引用,没有拷贝;浅拷贝,浅层拷贝,深层引用;深拷贝,整体拷贝,没有引用。 3 4 #1.直接赋值,传递对象的引用,原始列表改变,被赋值的也会做出相同的改变。 5 6 list_1 = [1,2,3,4,['m','t']] 7 list_2 = list_1 8 print(id(list_1),id(list_2)) 9 #输出:35493192 35493192 10 11 list_1.append(5) 12 print(list_1,id(list_1)) 13 print(list_2,id(list_2)) 14 #输出: 15 # [1, 2, 3, 4, ['m', 't'], 5] 35362120 16 # [1, 2, 3, 4, ['m', 't'], 5] 35362120 17 18 #2.浅copy:没有拷贝子对象,所以原始数据改变,子对象会改变 19 import copy 20 list_3 = copy.copy(list_1) 21 print(list_1,id(list_1)) 22 print(list_3,id(list_3)) 23 #输出: 24 # [1, 2, 3, 4, ['m', 't']] 37524808 25 # [1, 2, 3, 4, ['m', 't']] 37780424 26 27 list_1[2] = 'zz' 28 print(list_1,id(list_1)) 29 print(list_3,id(list_3)) 30 #输出: 31 # [1, 2, 'zz', 4, ['m', 't']] 35558728 32 # [1, 2, 3, 4, ['m', 't']] 37977032 33 34 list_1[4][0] = 'hh' 35 print(list_1,id(list_1)) 36 print(list_3,id(list_3)) 37 #输出: 38 # [1, 2, 3, 4, ['hh', 't']] 31954248 39 # [1, 2, 3, 4, ['hh', 't']] 32209864 40 41 #3.深copy:对象里面的子对象也拷贝了,所以原始对象的改变不会造成深拷贝里任何元素的改变 42 import copy 43 list_4 = copy.deepcopy(list_1) 44 print(list_1,id(list_1)) 45 print(list_4,id(list_4)) 46 #输出: 47 # [1, 2, 3, 4, ['m', 't']] 35362120 48 # [1, 2, 3, 4, ['m', 't']] 37977032 49 50 list_1[2] = 'zz' 51 print(list_1,id(list_1)) 52 print(list_4,id(list_4)) 53 #输出: 54 # [1, 2, 'zz', 4, ['m', 't']] 35427656 55 # [1, 2, 3, 4, ['m', 't']] 35683272 56 57 list_1[4][0] = 'hh' 58 print(list_1,id(list_1)) 59 print(list_4,id(list_4)) 60 #输出: 61 # [1, 2, 3, 4, ['hh', 't']] 35624264 62 # [1, 2, 3, 4, ['m', 't']] 35879880