一些后续会用到的名词解释
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用户对象即可