python中的深浅copy

深浅copy

复制,首先我们从切片技术说起。它应用于所有的序列,包括:列表,字符串,元祖。但是切片不能应用于字典,对于字典只能使用D.copy() 和 D.deepcopy()方法。

下面具体说一下深浅copy,可以应用于序列,也可以应用于字典

import copy 

a ={'a':1,'b':2}
x = copy.copy(a)          
#浅拷贝:只拷贝顶级的对象,或者说父级对象
y = copy.deepcopy(a)    
#深拷贝:拷贝所有的对象,顶级对象及其嵌套对象。
#或者说父级对象及其子对象

所以说:
  
深浅拷贝都是对源对象的复制,占用不同的内存空间

如果源对象只有一级目录的话,源对象做任何改动,不影响深浅拷贝对象

如果源对象不止一级目录的话,源对象做任何改动,都要影响浅拷贝,但不影响深拷贝

序列对象的切片其实是浅拷贝,即只拷贝顶级的对象

浅copy

data = {    
    "name":"alex",    
    "age":18,    
    "scores":{        
        "语文":130,        
        "数学":60,        
        "英语":98,    
     }
}

d2 = data

data["age"] = 20 
print(d2) 

问题来了:d2打印的值里,age是18,还是20?

{'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 60, '英语': 98}}

为何是20呢? 因为d2=data相当于只是拿到了data的内存地址,但data里的每个k,v都是有单独的内存的地址的。d2,data会一直共享这个dict里的数据,不会出现像之前字符串a=1,b=a, a=2, b依然等于1的情况。
在这里插入图片描述

如果我确实想复制一份完成的dict数据怎么办呢?

可以用浅copy语法

data = {    
   "name":"alex",    
   "age":18,    
   "scores":{        
        "语文":130,        
        "数学":60,        
        "英语":98,    
   }
}

d2 = data.copy()

data["age"] = 20
print(d2)
print(data)

输出

{'name': 'alex', 'age': 18, 'scores': {'语文': 130, '数学': 60, '英语': 98}}
{'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 60, '英语': 98}}

这样就相当于是2份独立数据了, 但是为什么这个语法叫做浅copy呢? 你改一下score里的值 就知道了。

data = {    
    "name":"alex",    
    "age":18,    
    "scores":{        
        "语文":130,        
        "数学":60,        
        "英语":98,    
        }
 }
 d2 = data.copy()
data["age"] = 20
data["scores"]["数学"] = 77 

print(d2)
print(data)

看输出 , 很神奇,两个Dict里age的值是独立的,但score字典里的分数值貌似是共享的

{'name': 'alex', 'age': 18, 'scores': {'语文': 130, '数学': 77, '英语': 98}}
{'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 77, '英语': 98}}

因为浅copy会仅复制dict的第一层数据,更深层的scores下面的值依然是共享一份。
在这里插入图片描述

深copy

若你想彻底使上面的2个dict完全独立,无论有多少层数据。那就要用python工具包里的一个工具了.
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值