Python中copy和deepcopy的区别,以及编程实现deepcopy的功能

在python中,有浅复制copy()和深度复制deepcopy(),这两个的区别我用以
下的例子来说明,例如:
numlist=[[1,2,[3,4,5]],34,"haha",{"name":{"fistname":"孙","lastName":"悟空"}}]
设  numlist1 = copy(numlist),numlist1是numlist经过浅复制后得到的一个列表,
设  numlist2 = deepcopy(numlist),numlist2是numlist经过深度复制后的带的一个列表
两者的区别:
假如运行表达式 numlist[0][2] = 6,则上面的三个列表的值如下:
numlist=[[1,2,6],34,"haha",{"name":{"fistname":"孙","lastName":"悟空"}}]
numlist1 = numlist=[[1,2,6],34,"haha",{"name":{"fistname":"孙","lastName":"悟空"}}]
numlist2 = numlist=[[1,2,[3,4,5]],34,"haha",{"name":{"fistname":"孙","lastName":"悟空"}}]
再运行表达式  numlist[3]["name"]="孙大圣" ,三个列表就变成了如下:
numlist=[[1,2,6],34,"haha",{"name":"孙大圣"}]
numlist1 = numlist=[[1,2,6],34,"haha",{"name":"孙大圣"}]

numlist2 = numlist=[[1,2,[3,4,5]],34,"haha",{"name":{"fistname":"孙","lastName":"悟空"}}]


copy()和deepcopy()的区别总结如下:
由浅复制得到的列表,如果列表中含有可变类型的数据,则只要一个列表中的可变类型的数据改变后,另一个表的可变类型的数据也会改变,例如上面的numlist和numlist1而由深度复制得到的列表,如果列表中含有可变类型的数据,则只要一个列表中的可变类型的数据改变后,另一个表 的可变类型的数据不会改变,例如上面的numlist和numlist2


编写程序实现deepcopy:
定义个处理函数 deepcopy(data),data是传进来的序列,创建一个新的列表listdata,然后遍历
序列data,如果是int类型或者str类型等不可变类型的数据,直接添加到listdata中,如果是dict(字
典类型的数据),则调用copydict(i)函数,因为字典的遍历跟tuple和list的遍历不同,所以这里定义
了一个专门拿来处理字典类型的函数,如果是list(列表)或者tuple(元组)类型的数据,则递归调
用deepcopy()函数,直到所有的数据都是不可变类型的数据。


代码如下:

#自定义的deepcopy函数
def deepcopy(data):
    #新建的列表
    listdata = []
    if len(data)!=1:
        for i in data:
            #如果idict类型的数据,则调用字典处理函数copydict()
            if isinstance(i,dict):
                dictdata = copydict(i)
                listdata.append(dictdata)
            #如果是元组和列表则递归调用deepcopy()函数
            elif isinstance(i,list) or isinstance(i,tuple):
                listdata1 = deepcopy(i)
                listdata.append(listdata1)
            #其他不可变类型的数据就添加到列表listdata            else:
                listdata.append(i)
    else:
        return data
    return listdata

#字典类型的处理函数
def copydict(data):
    dict1 = {}
    #遍历字典
    for keys,values in data.items():
        #以下的每一步的含义与deepcopy中的相似
        if isinstance(values,dict):
            numdict=copydict(values)
            dict1[keys]=numdict
        else:
            value = deepcopy(values)
            dict1[keys]=value
    return dict1

if __name__ == '__main__':
    numlist = [[1, 2, [3, 4, 5]], 34, "number", {"name": {"fistname": "", "lastName": "悟空","listname":[1,2,3]}}]
    numlist2 = deepcopy(numlist)
    print(id(numlist[0]))
    print(id(numlist2[0]))
    print(numlist2)
    print(numlist)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值