淺析Python中深拷貝和淺拷貝
阿新 • • 發佈:2018-08-10
int lis end 四種 都是 變量 內存空間 string -- 按照以下不同情況,在IDE中逐個解除註釋,就明白了
import copy """ 第一種情況,不可變類型變量,都是引用 """ # a = 1 # a = (11, 222, 333) # a = ‘string‘ # a = True # b = a # # print(id(a)) # print(id(b)) # # c =copy.copy(a) # d = copy.deepcopy(a) # print(id(c)) # print(id(d)) """ 第二種情況,可變類型變量,淺拷貝和深拷貝都開辟了空間 備註:[(1,2),3]外層可變,內層不可變,同此類型。 """ # a = [2, 3, 4] # # a = {2,5,6} # # a = {"name": "jim"} # b = a # c =copy.copy(a) # d = copy.deepcopy(a) # # print(id(a)) # print(id(b)) # print(id(c)) # print(id(d)) # # # ................ # a.append(5) # # ---------------- # # print(a) # print(b) # print(c) # print(d) """ 第三種情況,內外層都是不可變類型的,深淺拷貝都是引用 """ # a = ((1,2),) # b = a # c =copy.copy(a) # d = copy.deepcopy(a) # # print(id(a)) # print(id(b)) # print(id(c)) # print(id(d)) # # # print(a) # print(b) # print(c) # print(d) """ 第四種情況,外層不可變,內層可變,因為淺拷貝對不可變類型只是指向了,也即引用了內存地址,深拷貝重新開辟了內存地址。 """ # e = 1 # f = 2 # list1 = [e, f] # a = (list1,) # a= ([1,2],) # b = a # # print(id(a)) # print(id(b)) # # c =copy.copy(a) # d = copy.deepcopy(a) # print(id(c)) # print(id(d)) # # list1.append(8) # # print(id(a)) # print(id(b)) # print(id(c)) # print(id(d)) # print(a) # print(b) # print(c) # print(d) """ 第五種情況,外層可變,內層可變----真正體現淺拷貝和深拷貝的差距,a[:]是一種淺拷貝。深淺拷貝都重新開辟了內存空間,淺拷貝的內層元素只是引用了內存地址,深拷貝的內層元素也重新開辟了內存空間。 """ e = 1 f = 2 list1= [e,f] g = 3 h = 4 list2 = [g,h] a = [list1,list2] b = a c =copy.copy(a) d = copy.deepcopy(a) print(id(a)) print(id(b)) print(id(c)) print(id(d)) print(a) print(b) print(c) print(d) print("*" * 20) # 改變e或者f的元素 list1.append(‘list1‘) print(id(a)) print(id(b)) print(id(c)) print(id(d)) print(a) print(b) print(c) print(d) print("*" * 20) a.append(‘a‘) print(id(a)) print(id(b)) print(id(c)) print(id(d)) print(a) print(b) print(c) print(d)
淺析Python中深拷貝和淺拷貝