1、數字、字符串不管是淺拷貝、深拷貝都是指向一個地址。ide
a = 1 b = "abc" print (id(a)) print (id(b)) a1 = a b1 = b print (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))
2、列表、元組、字典的淺拷貝、深拷貝指向的地址是變化的。函數
1.元組中包含列表、字典 spa
#定義個函數:打印元組中全部數據的地址 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 "一、元組中包含字典、列表" 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)
賦值、淺拷貝後,元組和元組中全部元組地址,都指向的是一個地址;3d
深拷貝後,元組、元組中列表、字典的地址都是新建立的,其餘的元素地址與原來一致; code
2.字典中包含列表、元組blog
#定義個函數:打印字典中全部數據的地址 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 "二、字典包含列表、元組" 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)
賦值指向的是一個地址;字符串
淺拷貝後,字典的地址是新建立的,裏面元素(包括列表、元組)的地址與原來一致;it
深拷貝後,字典的地址、字典中列表的地址是新建立的,元組的地址仍是原來的,裏面的元素地址與原來一致;event
3.列表中包含字典、元組class
#定義個函數:打印列表中全部數據的地址 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)
賦值指向的是一個地址;
淺拷貝後,列表的地址是新建立的,裏面元素(包括字典、元組)的地址與原來一致;
深拷貝後,列表的地址、列表中字典的地址是新建立的,元組的地址仍是原來的,其餘的元素地址與原來一致;
總結:
1.元組自己在深淺拷貝中,地址會變;但做爲列表或者字典的元素時,在深拷貝列表或字典時,地址是不變的。
2.列表、字典自己在淺拷貝中地址會變;做爲元素時,在深拷貝中地址纔會變;