python深拷贝和浅拷贝总结

面试中必考的题,还以为自己弄懂了,今天一问又蒙蔽了,总结一下!

假设有一个列表,如下:

l = [1, 2, 3, 4, [1, 2, 3] ]

new_l = l                                               对 对象 l 的引用

copy_l = copy.copy(l)                            对 对象 l 的浅拷贝

deepcopy_l = copy.deepcopy(l)            对 对象 l 的深拷贝

然后呢,我打印出这四个列表的内存地址:

l = [1, 2, 3, 4, [1, 2, 3] ]                                   id(l)                      --------------->     1631063137352        

new_l = l                                                        id(new_l)              --------------->     1631063137352

copy_l = copy.copy(l)                                     id(copy_l)             --------------->     1631063137416

deepcopy_l = copy.deepcopy(l)                     id(deepcopy_l)     --------------->     1631063026632

可以看到,使用copy这个模块创建的浅拷贝和深拷贝在内存中都有一个新的内存空间。

进一步查看四个列表中不可变类型的id值:

l = [1, 2, 3, 4, [1, 2, 3] ]                                   id(l[1])                      --------------->     1400022144       

new_l = l                                                        id(new_l[1])              --------------->     1400022144

copy_l = copy.copy(l)                                     id(copy_l[1])             --------------->     1400022144

deepcopy_l = copy.deepcopy(l)                     id(deepcopy_l[1])     --------------->     1400022144

再查看可变类型的id值:

l = [1, 2, 3, 4, [1, 2, 3] ]                                   id(l[-1])                      --------------->     1631063137544       

new_l = l                                                        id(new_l[-1])              --------------->     1631063137544

copy_l = copy.copy(l)                                     id(copy_l[-1])             --------------->     1631063137544

deepcopy_l = copy.deepcopy(l)                     id(deepcopy_l[-1])     --------------->     1631063186312

可以看到,浅拷贝是不会对 l 中的数据结构进行深层次的拷贝的。也就是说,我要是在 l 列表,更改了 l[-1] 的值,那么copy_l中的最后一个元素的值是会跟着改变的,因为他跟 l 引用的地址是同一个,而deepcopy_l的值是不会变的。 

面试中,还有一个问题是

l[::-1]   结果应该是 [[1, 2, 3], 4, 3, 2, 1]

list[indexStart: indexEnd: step], 当step>0的时候,正向取值, 也就是从左往右取值,当step<0时,逆向取值。所以l[::-1]都是取的列表的逆序表, 也就是从右往左取值。

分片操作其实就是按照一定的顺序访问序列中某一范围内的元素,记住一点就行了,那就是在一定的访问顺序中,indexStart所对应的元素必须先于indexEnd所对应的元素被访问到,否则,分片操作返回的就是空的序列;而访问元素的顺序由step决定是从左往右,还是从右往左。

因此,l[0: -1: -1]是取不到值得。step < 0 ,从右往左访问数据, 先访问到得是indexEnd,再访问到indexStart。因此取到得得列表是空列表。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值