python浅拷贝和深拷贝

参考资料:
python内存可视化


预备知识

1、python数据类型

不可变数据类型:数字、字符串、元祖
可变数据类型:列表、集合、字典

不可变数据类型都不能通过切片的方式修改值,我们要修改只能重新开辟一块内存空间。


2、is和==

is比较内存地址

==比较元素值


一、赋值:b = a


无论元素是可变还是不可变,修改一个,二者内容都变
在这里插入图片描述

1、id相同,值相同:指向一块内存区域

>>> a = [1,2,3]
>>> b = a
>>> a is b
True

2、修改b元素值,a元素值也会变
在这里插入图片描述


二、切片是浅拷贝!b = a[:]

浅复制:

  1. 生成一个新的列表
  2. 把原列表中所选元素的引用都复制到新列表中。

在这里插入图片描述

1、如果是append对引用原地操作,则a也会被修改
2、如果是赋新值,则指向新值的引用,和原a就无关了

在这里插入图片描述


三、append(传入引用)


append是原地操作
1、lst.append(可变元素),可变元素修改,则lst内容也变化

在这里插入图片描述

b = []
c = [1,23] # 可变元素:列表
b.append(c)
c[1] = 100 #修改c,b也变化 

2、lst.append(不可变元素),不可变元素修改,lst内容不变

在这里插入代码片

b = []
c = 'hello'
b.append(c)
c = 'newstring'

3、回溯类题目注意点:传入res_lst的子列表,要通过切片使之独立传入,否则递归过程元素会统一修改


四、深拷贝:b = copy.deepcopy(a)

新旧列表所有元素完全独立
只有刚复制来的元素值完全相同

在这里插入图片描述

# 引入标准库copy中的deepcopy()函数
import copy
a = ['cc',[1,2,3],{'age':[2,3,4]}]
b = copy.deepcopy(a)
>>> a is b
False
>>> a == b
True

五、切片是原地修改


非切片:不改变内部子数组
在这里插入图片描述
切片赋值
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunMoonStar_c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值