標籤:open class style art lin code log pen for
一、數字、字串不論是淺拷貝、深拷貝都是指向一個地址。
a = 1b = "abc"print (id(a))print (id(b))a1 = ab1 = bprint (id(a1),id(b1))a2 = copy.copy(a)b2 = copy.copy(b)print (id(a2),id(b2))a3 = copy.deepcopy(a)b3 = copy.deepcopy(b)print (id(a3),id(b3))
View Code
二、列表、元組、字典的淺拷貝、深拷貝指向的地址是變化的。
1.元組中包含列表、字典
#定義個函數:列印元組中所有資料的地址def print_tuple(tuple): tup = tuple print tup,id(tup) for k, v in enumerate(tup, 1): print v, id(v) if type(v) == list: key = v for k, v in enumerate(key, 1): print v, id(v) elif type(v) == dict: key = v for item in key: print item, id(item) print key[item], id(key[item])tup = (1,2,[‘a‘,‘b‘],{"k1":11})print "1、元組中包含字典、列表"print_tuple(tup)#tup1 = tup#print "======賦值後======"#print_tuple(tup1)tup2 = copy.copy(tup)print "======淺拷貝後======"print_tuple(tup2)tup3 = copy.deepcopy(tup)print "======深拷貝後======"print_tuple(tup3)View Code
賦值、淺拷貝後,元組和元組中所有元組地址,都指向的是一個地址;
深拷貝後,元組、元組中列表、字典的地址都是新建立的,其他的元素地址與原來一致;
2.字典中包含列表、元組
#定義個函數:列印字典中所有資料的地址def print_dic(dict): dic = dict print dic,id(dic) for item in dic: print item, id(item) print dic[item], id(dic[item]) if type(dic[item]) == list: li = dic[item] for k, v in enumerate(li, 1): print v, id(v) elif type(dic[item]) == tuple: tup = dic[item] for k, v in enumerate(tup, 1): print v, id(v)dic = {"a":11,"c":12,"d":(‘x‘,100,‘z‘),"2":["b",13]}print "2、字典包含列表、元組"print_dic(dic)#dic1 = dic#print "======賦值後======"#print_dic(dic1)dic2 = copy.deepcopy(dic)print "======深拷貝後======"print_dic(dic2)#dic3 = copy.copy(dic)#print "======淺拷貝後======"#print_dic(dic3)View Code
賦值指向的是一個地址;
淺拷貝後,字典的地址是新建立的,裡面元素(包括列表、元組)的地址與原來一致;
深拷貝後,字典的地址、字典中列表的地址是新建立的,元組的地址還是原來的,裡面的元素地址與原來一致;
3.列表中包含字典、元組
#定義個函數:列印列表中所有資料的地址def print_out(list): li = list print li,id(li) for item in li: print item, id(item) # print li[i],id(li[i]) if type(item) == dict: dic = item # for k,v in enumerate(dic,1): # print k,id(k) # print v,id(v) for item in dic: print item, id(item) print dic[item], id(dic[item]) elif type(item) == tuple: tup = item for k, v in enumerate(tup, 1): print v, id(v)li = [‘1‘,(‘x‘,‘y‘),{"k1":0,"k2":10}]print_out(li)#li1 = li#print "======賦值後======"# print_out(li1)#li2 = copy.copy(li)#print "======淺拷貝後======"#print_out(li2)li3 = copy.deepcopy(li)print "======深拷貝後======"print_out(li3)View Code
賦值指向的是一個地址;
淺拷貝後,列表的地址是新建立的,裡面元素(包括字典、元組)的地址與原來一致;
深拷貝後,列表的地址、列表中字典的地址是新建立的,元組的地址還是原來的,其他的元素地址與原來一致;
總結:
1.元組本身在深淺拷貝中,地址會變;但作為列表或者字典的元素時,在深拷貝列表或字典時,地址是不變的。
2.列表、字典本身在淺拷貝中地址會變;作為元素時,在深拷貝中地址才會變;
Python練習四-淺拷貝&深拷貝