关于Python中的深浅拷贝和可变类型的理解

部分文章转载:https://www.jb51.net/article/166488.htm

1、可变类型和不可变类型

对于一个变量,改变其值,如果他地址也变了,则是不可变类型
反之,如果值变化但是地址不变,则是可变类型。

Python中的不可变类型:
int ,str,float,tuple,bool …

Python中的不可变类型:
list,dict,set

因此对于字典dict的key值来说,因为key是不可变的 ,所以上述不可变的数据类型才可以作为字典的key
列表不可以作为字典的key值试用

2、深浅拷贝

首先元组不能copy
其次,切片操作也是浅拷贝copy

拷贝分别深浅拷贝:copy和deepcopy

1、浅拷贝copy

浅拷贝copy是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容
在这里插入图片描述
通过a=b这种方式赋值只是赋值的引用(内存地址),a和b都指向了同一个内存空间,所以他们的id(地址相同),这种就是浅拷贝
多层嵌套情况
在这里插入图片描述
浅拷贝的情况下,b会跟着原数组a的内层对象变化,当最外层a的对象变化时,b不会随之变化,具体的内存分配如图:
在这里插入图片描述

2、深拷贝copy.deepcopy

通过调用copy包里的deepcopy方法来深拷贝
通俗的理解就是完全的复制,复制之后就是两个完全不相干的变量,一个变化不会影响第二个
在这里插入图片描述
其实就是在内存区在分配保存了和a相同的数据,用c来指向它,和a的内存地址不同。怎么验证就是我说的这种情况的呢?用下图来说明吧:
在这里插入图片描述
可以看出向a 添加一个元素,通过浅拷贝的b也随着改了,但是通过深拷贝的c没改,可以判断c和a指向不同的内存地址。
多层嵌套的情况
如果是类似这种结构的数据的深拷贝呢:
在这里插入图片描述
深拷贝d时其实把a里面的a,b都深拷贝了一份,是递归式的深拷贝。
通过验证就是如图所示:
在这里插入图片描述

3、=赋值操作

另外说一下=赋值操作,a=b这时这两个变量完全相同包括值和地址,完全一样
在这里插入图片描述
其中一个变化,另一个也会随之变化,不论是内层还是外层,二者保持完全一样

4、例题加深印象

例一
在这里插入图片描述
例二
在这里插入图片描述
在这里插入图片描述

温故而知新,勤加复习
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值