Python練習四-淺拷貝&深拷貝

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))
View Code

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)
View Code

賦值、淺拷貝後,元組和元組中全部元組地址,都指向的是一個地址;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)
View Code

賦值指向的是一個地址;字符串

淺拷貝後,字典的地址是新建立的,裏面元素(包括列表、元組)的地址與原來一致;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)
View Code

賦值指向的是一個地址;

淺拷貝後,列表的地址是新建立的,裏面元素(包括字典、元組)的地址與原來一致;

深拷貝後,列表的地址、列表中字典的地址是新建立的,元組的地址仍是原來的,其餘的元素地址與原來一致;

總結:

1.元組自己在深淺拷貝中,地址會變;但做爲列表或者字典的元素時,在深拷貝列表或字典時,地址是不變的。

2.列表、字典自己在淺拷貝中地址會變;做爲元素時,在深拷貝中地址纔會變;

相關文章
相關標籤/搜索