python3 的深拷贝、浅拷贝、切片、对象拷贝

浅拷贝

既可应用序列(列表、元组、字符串),也可应用字典。

拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制

深拷贝

既可应用序列(列表、元组、字符串),也可应用字典。

外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。

切片

切片可以应用于:列表、元组、字符串,但不能应用于字典。

深拷贝、浅拷贝的作用

1:减少内存的使用
2:以后在做数据的清洗、修改或者入库的时候,对原数据进行复制一份,以防数据修改之后,找不到原数据。

不可变对象的深浅拷贝

不可变对象类型,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。
一句话就是,不可变类型,不管是深拷贝还是浅拷贝,地址值和拷贝后的值都是一样的。

>>> a=(1,2,3)
>>> print('=====shallow copy 1=====')
=====shallow copy 1=====
>>> b=a
>>> a
(1, 2, 3)
>>> b
(1, 2, 3)
>>> id(a)
140332499966568
>>> id(b)
140332499966568
>>> print('=====shallow copy 2=====')
=====shallow copy 2=====
>>> b=copy.copy(a)
>>> a
(1, 2, 3)
>>> b
(1, 2, 3)
>>> id(a)
140332499966568
>>> id(b)
140332499966568
>>> print('=====deep copy=====')
=====deep copy=====
>>> b=copy.deepcopy(a)
>>> a
(1, 2, 3)
>>> b
(1, 2, 3)
>>> id(a)
140332499966568
>>> id(b)
140332499966568

可变对象深浅拷贝

=浅拷贝:值相等,地址相等
copy浅拷贝:值相等,地址不相等
deepcopy深拷贝:值相等,地址不相等

>>> a=[1,2,3]
>>> print('=====shallow copy 1=====')
=====shallow copy 1=====
>>> b=a
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> id(a)
140332500059464
>>> id(b)
140332500059464
>>> print('=====shallow copy 2=====')
=====shallow copy 2=====
>>> b=copy.copy(a)
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> id(a)
140332500059464
>>> id(b)
140332500058376
>>> print('=====deep copy=====')
=====deep copy=====
>>> b=copy.deepcopy(a)
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> id(a)
140332500059464
>>> id(b)
140332500059080

总结

1:深浅拷贝都是对源对象的复制,占用不同的内存空间。
2:不可变类型的对象,对于深浅拷贝毫无影响,最终的地址值和值都是相等的。
3:可变类型:
=浅拷贝: 值相等,地址相等
copy浅拷贝:值相等,地址不相等 (切片赋值是浅拷贝,只拷贝外侧列表,子列表与原列表公用一份,如果原列表的最外层增删改查,浅拷贝后的列表不变。但是如果原列表的子列表增删改查,浅拷贝后的子列表变化)
deepcopy深拷贝:值相等,地址不相等

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值