python基础之深浅copy

关于深浅copy问题一直都是一个极易混淆的存在,今天自己尝试理解了一下,感觉不是那么难以区分和理解,现在将理解的心得分享一下:

一、赋值,将copy之前先看一下直接赋值

#直接赋值,是内存地址共享

list1=[2,3,4,6,7,[1,3,6,8,'test'],1,4,8,9,1]
list2=list1
list2[0]='s'
list2[5][-1]='try'
print(id(list1),id(list2),list1,list2)

打印出来的结果如下:

 需要注意的是,直接赋值内存地址没有发生任何变化,相当于多了一条通往该内存地址的路径而已,赋值以后,改变任何一个变量,都会影响内存地址里的值,接下来要注意区分和copy的不同。

二、浅copy

import copy

#copy函数(浅copy),生成了一个副本,多层嵌套时只会copy第一层,所以第一层的内存地址会发生变化,但是嵌套里的内存地址不会发生变化
list1=[2,3,4,6,7,[1,3,6,8,'test'],1,4,8,9,1]
list_lig=copy.copy(list1)
list_lig[0]='a'
list_lig[5][-1]='try'
print(id(list1),id(list_lig),list1,list_lig)

 打印结果如下:

 为什么是浅copy,大家可以理解一下这个‘浅’字,我的理解就是只copy了第一层(在多层嵌套的情况下),只有第一层的内存地址是发生了变化,其里面的子层,无论是几层的嵌套,内存地址都没有改变。

三、深copy

#深copy,生成了一个副本,多层嵌套就会多层copy,内存地址完全不共享

list_org=[1,3,4,6,7,8,'s','g',['a','p',4,7],3,6,'t']

list_deep=copy.deepcopy(list_org)

list_deep[0]='test'
list_deep[8][0]=0

print(id(list_org),id(list_deep),list_org,list_deep)

打印结果如下:

 

和浅copy一样,先理解字,‘深’,就是有几层copy几层,生成了一个和原来对象完全相同的副本,内存地址完全隔离,你在副本上的任何操作都不会影响初始对象。如果了解pandas的话,会联想到pandas的copy函数,是一样的道理。

区分深浅copy的话,就是从字面理解,浅就是只copy了最外层,局部副本操作,深就是全局的,全部副本操作。

ps:提醒大家一点,我这里为了简单直接,命名不是很规范,希望大家在代码里规范使用命名,省的被骂。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值