【python笔记】浅析字典中的赋值,浅拷贝和深拷贝


前言

最近学习python中的字典的时候遇到字典中的一个内置bif,它可以拷贝字典,但是有意思的是copy模块中也提供了一个方法拷贝字典,还有最简单的赋值也可以拷贝字典,那么这三者有什么区别呢,本文将简单讲解这一问题。


正文

  1. 赋值法:
    这个就很懒了,人家改都不改,直接拿拷贝的引用指向的被拷贝的字典对象的内存空间。结果就是拷贝的字典一修改,原来的字典也被改了。
    我们看下代码示例:

    >>> d1 = {'author':'lz','age':19}
    >>> d2 = d1
    >>> d1
    {'author': 'lz', 'age': 19}
    >>> d2
    {'author': 'lz', 'age': 19}
    >>> d2['author'] = 'Mogu134'
    >>> d1
    {'author': 'Mogu134', 'age': 19}
    >>> d2
    {'author': 'Mogu134', 'age': 19}
    
  2. 深拷贝(deepcopy)
    我们先来看deepcopy,这个货是和上面那个完全相反的,它直接递归拷贝所有数据,相当于完全在另外内存中新建原字典,不管是引用也好,数值也罢,它都全拷了,简直就是劳模。

  3. 浅拷贝(shallow copy)
    终于到了主角,这货是个中间派,它拷东西喜欢拷一半,字典中的元素它都拷,但是如果元素是个对象,他就要考虑考虑了,最后还是只拷人家的引用,数值就不管了。
    我们来看看它和深拷贝拷贝的引用的id就明白一切了:

>>> import copy
>>> d1 = {'author':'Mogu134','age':[19,20]}
>>> d2 = copy.deepcopy(d1)
>>> d3 = d1.copy()
>>> id(d1['age'])
1986229812160
>>> id(d2['age'])
1986229875264
>>> id(d3['age'])
1986229812160

看见没有,浅拷贝这货偷懒,碰到列表对象就直接拿人家的过来用了,id都是一样的,而深拷贝这货勤勤恳恳直接在内存开辟了一块新的地址空间。

下面这两张图就很好地说明了这个:在这里插入图片描述
在这里插入图片描述


总结

这是个没有总结的总结,赋值这货吧,就是最偷懒的,其次是浅拷贝,最勤快的是深拷贝;赋值拷贝的是字典的引用,浅拷贝拷贝对象引用,而不拷对象数值,深拷贝全拷,管你是什么。

参考文章

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值