python的深浅copy

本文介绍了Python中的内存管理、对象、引用以及浅拷贝和深拷贝的概念。通过实例演示了浅拷贝如何受到其他引用对象影响,而深拷贝则能独立于原对象。在实际应用中,如用户下相同订单场景,深拷贝的重要性得以体现。
摘要由CSDN通过智能技术生成

一些后续会用到的名词解释

1 对象:内存开辟一块空间,用来存数据,这个内存块整体为对象
2 引用:理解为一跟线将变量与对象绑在一起,因此根据变量名字可找到对象
3 可变对象:列表 集合 字典
4 不可变对象:数值 元组 字符串
5 内存地址:数据在内存中保存的位置 (*id(变量名) 可打印出变量的内存地址)
在这里插入图片描述

概念

浅copy

官方:构造一个新的复合对象并从原对象中发现的引用插入该对象中。
人话:新建一个和原来一样的对象,包括原来对象里面的 变量和变量的引用,因此产生的对象不受其他引用对象操作的影响 (加粗部分看完实战会更能理解)
图示:
在这里插入图片描述

如何实现浅copy:
*还有其他方式 博主就会这几种 hehe
1 copy模块的copy方法
import copy
copy.copy(变量)
2 工厂方法
3 切片操作
a = [1,2]
b = a[::]

深copy

官方:构造一个新的复合对象,但是遇到引用会继续递归拷贝其所指的具体内容,也就是说他会针对引用所执行的对象继续执行考呗,** 因此产生的对象不受其他引用对象操作的影响 **
人话:新建一个和原来一样的对象,包括原来对象里面的变量和变量的引用, 并且还会将变量的引用所指的数据新建一份(只将可变对象数据新建一份
图示:
在这里插入图片描述
如何实现深copy:
一种
import copy
copy.deepcopy(变量名)

实战

一道常见题目

a = [1, 2, [‘day’]]
b = l1[::]
a[-1].append(666)
print(b)

答案:[1, 2, [‘day’, 666]]
解析:
1 列表属于可变数据类型,所以a中[‘day’]这个列表是可变的,a[-1].append(666)执行完后,列表由[‘day’]->[‘day’,666]
2 a[::]属于切片操作,是浅copy,a的操作会对b产生影响(就是上文中的产生的对象受其他引用对象操作的影响)
图示
在这里插入图片描述

将此题目变化一下

import copy
a = [1, 2, [‘day’]]
b = copy.deepcopy(a)
a[-1].append(666)
print(b)

答案:[1, 2, [‘day’]]
解析:
1 列表属于可变数据类型,所以a中[‘day’]这个列表是可变的,a[-1].append(666)执行完后,列表由[‘day’]->[‘day’,666]
2 深copy,a的操作不会对b产生影响,也就是说a对[‘day’]作任何增删改查操作,b的数据都不会受影响
图示
在这里插入图片描述

将此题目再变化一下

import copy
a = [1, 2, [‘day’]]
b = copy.copy(a)
a.append(3)
print(b)
答案: [1,2,[‘day’],3]
图示:
在这里插入图片描述

应用场景

待补充
1 ab用户下相同的订单,则可以直接copy a用户对象即可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值