为了账号安全,请及时绑定邮箱和手机立即绑定

python拷贝list

标签:
Python

来源

引用和值

在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用(引用是指保存的值为对象的地址),因此对于它们的使用就需要小心一些,特别是复制list和dict时。下面举个例子:

问题描述:已知一个列表,求生成一个新的列表,列表元素是原列表的复制

a=[1,2]b=a

这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。这样,如果对a或b的元素进行修改,a,b的值同时发生变化。
解决的方法为:

a=[1,2]b=a[:]

这样修改a对b没有影响。修改b对a没有影响。
但 这种方法只适用于简单列表,也就是列表中的元素都是基本类型,如果列表元素还存在列表(字典)的话,这种方法就不适用了。原因就是,像a[:]这种处理,只是将列表元素的值生成一个新的列表,如果列表元素也是一个列表,如:a=[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成 [2]的一个新的列表复制。为了证明这一点,测试步骤如下:

>>> a=[1,[2]]>>> b=a[:]>>> b[1, [2]]>>> a[1].append(3)>>> a[1, [2, 3]]>>> b[1, [2, 3]]  # b的值也被修改了

可见,对a的修改影响到了b。如果解决这一问题,可以使用copy模块中的deepcopy函数。修改测试如下:
复制代码 代码如下:

>>> import copy>>> a=[1,[2]]>>> b=copy.deepcopy(a)>>> b[1, [2]]>>> a[1].append(3)>>> a[1, [2, 3]]>>> b[1, [2]]

有时候知道这一点是非常重要的,因为可能你的确需要一个新的列表,并且对这个新的列表进行操作,同时不想影响原来的列表。

深拷贝和浅拷贝

其实,复制列表还有以下做法,但是只有deepcopy才是全复制,其他的都是浅拷贝.

lista = [2,[4,5]]## 5种拷贝方式:listb = lista[:]listb = list(lista)listb = [i for i in lista]import copy; listb = copy.copy(lista)import copy; listb = copy.deepcopy(lista)# 拷贝后续操作:listb[1].append(9)print lista, listb# 五种拷贝方式后续操作的结果(依次按顺序):[2, [4, 5, 9]] [2, [4, 5, 9]][2, [4, 5, 9]] [2, [4, 5, 9]][2, [4, 5, 9]] [2, [4, 5, 9]][2, [4, 5, 9]] [2, [4, 5, 9]][2, [4, 5]] [2, [4, 5, 9]]  # 只有deepcopy才是深拷贝

从性能上说(利用ipython的%timeit方法),上面方法的性能是依次递减的:

In [22]: %timeit b=a[:]10000000 loops, best of 3: 94.5 ns per loopIn [23]: %timeit b=list(a)10000000 loops, best of 3: 153 ns per loopIn [24]: %timeit b=[i for i in a]1000000 loops, best of 3: 238 ns per loopIn [27]: %timeit b=copy.copy(a)The slowest run took 10.53 times longer than the fastest. This could mean that an intermediate result is being cached.1000000 loops, best of 3: 475 ns per loopIn [28]: %timeit b=copy.deepcopy(a)The slowest run took 5.79 times longer than the fastest. This could mean that an intermediate result is being cached.100000 loops, best of 3: 5.36 µs per loop

总结

浅拷贝用: listb = lista[:], 深拷贝用listb = copy.deepcopy(lista)

字典

字典自带有copy的方法,但是也是浅拷贝

dicta = {"a": 1}dictb = dicta.copy()

参考:

  • [1]Python中使用copy模块实现列表(list)拷贝

  • [2]python的list的拷贝

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消