Python列表之如何copy列表

首先看一个问题:

>>> 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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值