Python练习四-浅拷贝&深拷贝

一、数字、字符串不论是浅拷贝、深拷贝都是指向一个地址。

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

二、列表、元组、字典的浅拷贝、深拷贝指向的地址是变化的。

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.列表、字典本身在浅拷贝中地址会变;作为元素时,在深拷贝中地址才会变;

转载于:https://www.cnblogs.com/jessie-ji/p/6502593.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值