面试中必考的题,还以为自己弄懂了,今天一问又蒙蔽了,总结一下!
假设有一个列表,如下:
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。因此取到得得列表是空列表。
热门工具 换一换