Python列表之如何copy列表

tech2026-01-22  4

首先看一个问题:

>>> a = [1,2,4,6,8] >>> b = a >>> c = a[::] #列表的切片 >>> a[0] = 5

那么a , b , c 分别等于多少?


结果如下: >>> a [5, 2, 4, 6, 8] >>> b [5, 2, 4, 6, 8] >>> c [1, 2, 4, 6, 8]

怎么感觉b是个‘墙头草’,a去哪它就去哪? 我们来看一下a, b, c 的内存地址:

>>> id(a) 59763528 >>> id(b) 59763528 >>> id(c) 59797704

可以发现a, b的内存地址是一样的,所以对a进行修改相当于也改了b 其实,他两是指向一个东西,只是有两个不同的标签(a,b)而已!

所以对列表的copy不能使用 ‘=’ 赋值语句,需使用切片


再看一个问题: >>> x = [1, 3, 5, [2, 3]] >>> y = x[::] >>> x[0] = 3

此时x, y等于多少呢? 你想的没错,是不一样:

>>> x [3, 3, 5, [2, 3]] >>> y [1, 3, 5, [2, 3]]

那继续,这样呢:

>>> z = x[::] >>> x[3].append(9) #将元素9添加至列表x尾部

此时z等于多少呢?

>>> x [3, 3, 5, [2, 3, 9]] >>> z [3, 3, 5, [2, 3, 9]]

哈哈,猜错了吧!z竟然等于x 这又是为什么呢? 其实切片是一种浅复制:只能拷贝父对象,不会拷贝对象的内部的子对象 [2, 3, 9]作为[3, 3, 5, [2, 3, 9]]的子对象,浅复制是不能copy的

所以此时应该使用深拷贝(deepcopy)

>>> import copy >>> w = copy.deepcopy(x) >>> x[3].append(11) #将元素11添加至列表x尾部 >>> x [1, 3, 5, [2, 3, 11]] >>> w [1, 3, 5, [2, 3]] >>>

这样就可以啦!


*好了,今天的所学的一些小东西就分享给大家了,欢迎一起学习交流!*
下面对列表的一些方法做些介绍:  方法说明 lst.append(x)将元素x添加至列表lst尾部 lst.extend(L) 将列表L中所有元素添加至列表lst尾部 lst.insert(index, x) 在列表lst指定位置index处添加元素x,该位置后面的所有元素后移一个位置 lst.remove(x) 在列表lst中删除首次出现的指定元素,该元素之后的所有元素前移一个位置 lst.pop([index]) 删除并返回列表lst中下标为index(默认为-1)的元素 lst.clear() 删除列表lst中所有元素,但保留列表对象 lst.index(x) 返回列表lst中第一个值为x的元素的下标,若不存在值为x的元素则抛出异常 lst.count(x) 返回指定元素x在列表lst中的出现次数 lst.reverse() 对列表lst所有元素进行逆序 lst.sort(key=None, reverse=False) 对列表lst中的元素进行排序,key用来指定排序依据,reverse决定升序(False),还是降序(True) lst.copy() 返回列表lst的浅复制
最新回复(0)