1. 程式人生 > 其它 >python 深拷貝 淺拷貝

python 深拷貝 淺拷貝

  1 # 不可變物件
  2 import copy
  3 
  4 number1 = 1
  5 stringA = 'A'
  6 turple1 = (1, 2, 3, 4, 5)
  7 
  8 # 可變物件
  9 dict1 = {"key": 1}
 10 list1 = [1, 2]
 11 
 12 # 巢狀物件
 13 # 外層不可變 內層不可變
 14 turple2 = (turple1, stringA)
 15 # 外層不可變 內層可變
 16 turple3 = (list1, dict1)
 17 # 外層可變  內層不可變
 18 list2 = [turple1, stringA]
19 # 外層可變 內層可變 20 list3 = [dict1, list1] 21 22 # 淺拷貝 簡單物件 23 # 引用 24 # number2 = copy.copy(number1) 25 # print(id(number1), id(number2)) 26 # 引用 27 # stringA_2 = copy.copy(stringA) 28 # print(id(stringA), id(stringA_2)) 29 # 引用 30 # turple1_2 = copy.copy(turple1) 31 # print(id(turple1), id(turple1_2))
32 # 新物件 33 # dict1_2 = copy.copy(dict1) 34 # print(id(dict1), id(dict1_2)) 35 # 新物件 36 # list1_2 = copy.copy(list1) 37 # print(id(list1), id(list1_2)) 38 ''' 39 總結: 淺拷貝 簡單物件 40 不可變物件是引用 41 可變物件是新物件 42 ''' 43 44 45 # 外層引用 內層引用 46 # turple2_2 = copy.copy(turple2) 47 # print(id(turple2),"--",id(turple2[0]),id(turple2[1]))
48 # print(id(turple2_2),"--",id(turple2_2[0]),id(turple2_2[1])) 49 50 # 外層引用 內層引用 51 # turple3_2 = copy.copy(turple3) 52 # print(id(turple3),"--",id(turple3[0]),id(turple3[1])) 53 # print(id(turple3_2),"--",id(turple3_2[0]),id(turple3_2[1])) 54 55 # 外層新物件 內層引用 56 # list2_2 = copy.copy(list2) 57 # print(id(list2),"--",id(list2[0]),id(list2[1])) 58 # print(id(list2_2),"--",id(list2_2[0]),id(list2_2[1])) 59 60 # 外層新物件 內層引用 61 # list3_2 = copy.copy(list3) 62 # print(id(list3),"--",id(list3[0]),id(list3[1])) 63 # print(id(list3_2),"--",id(list3_2[0]),id(list3_2[1])) 64 65 ''' 66 總結:淺拷貝 巢狀物件 67 內層都是引用, 68 外層物件不可變,外層引用 69 外層物件可變,外層新物件 70 ''' 71 72 # 深拷貝 簡單物件 73 # 引用 74 # number2 = copy.deepcopy(number1) 75 # print(id(number1), id(number2)) 76 # 引用 77 # stringA_2 = copy.deepcopy(stringA) 78 # print(id(stringA), id(stringA_2)) 79 # 引用 80 # turple1_2 = copy.deepcopy(turple1) 81 # print(id(turple1), id(turple1_2)) 82 # 新物件 83 # dict1_2 = copy.deepcopy(dict1) 84 # print(id(dict1), id(dict1_2)) 85 # 新物件 86 # list1_2 = copy.deepcopy(list1) 87 # print(id(list1), id(list1_2)) 88 ''' 89 總結: 深拷貝 簡單物件 90 不可變物件是引用 91 可變物件是新物件 92 與淺拷貝結果一樣 93 ''' 94 95 96 # 外層引用 內層引用 97 # turple2_2 = copy.deepcopy(turple2) 98 # print(id(turple2),"--",id(turple2[0]),id(turple2[1])) 99 # print(id(turple2_2),"--",id(turple2_2[0]),id(turple2_2[1])) 100 101 # 外層新物件 內層新物件 102 # turple3_2 = copy.deepcopy(turple3) 103 # print(id(turple3),"--",id(turple3[0]),id(turple3[1])) 104 # print(id(turple3_2),"--",id(turple3_2[0]),id(turple3_2[1])) 105 106 # 外層新物件 內層引用 107 # list2_2 = copy.deepcopy(list2) 108 # print(id(list2),"--",id(list2[0]),id(list2[1])) 109 # print(id(list2_2),"--",id(list2_2[0]),id(list2_2[1])) 110 111 # 外層新物件 內層新物件 112 # list3_2 = copy.deepcopy(list3) 113 # print(id(list3),"--",id(list3[0]),id(list3[1])) 114 # print(id(list3_2),"--",id(list3_2[0]),id(list3_2[1])) 115 116 ''' 117 總結:深拷貝 巢狀物件 118 內層是可變物件,內外層都是新物件, 119 內層是不可變物件,內層都是引用 120 此時 121 外層物件不可變,外層引用 122 外層物件可變,外層新物件 123 ''' 124 ''' 125 綜上: 126 淺拷貝 127 簡單物件 128 不可變物件是引用 129 可變物件是新物件 130 巢狀物件 131 內層都是引用, 132 外層物件不可變,外層引用 133 外層物件可變,外層新物件 134 135 深拷貝 136 簡單物件 137 不可變物件是引用 138 可變物件是新物件 139 巢狀物件 140 內層是可變物件,內外層都是新物件, 141 內層是不可變物件,內層都是引用 142 此時 143 外層物件不可變,外層引用 144 外層物件可變,外層新物件 145 146 簡單物件不受copy,deepcopy的影響, 147 不可變物件結果都是引用 148 可變物件結果都是新物件 149 150 對於巢狀物件 151 copy不是遞迴處理的,因為內層都是引用,沒有遞迴到簡單物件 152 的處理邏輯 153 外層可以當做簡單物件理解,可變物件深拷貝,不可變引用 154 155 deepcopy遞迴處理,受到內層物件影響 156 內層可變,內外層都是深拷貝(即使外層不可變) 157 內層不可變,內層引用 158 此時外層按照簡單物件處理 159 160 161 162 163 '''