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

假设有一个列表,如下:

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。因此取到得得列表是空列表。

 

 

 

 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信