转自:https://www.cnblogs.com/ifantastic/p/3811145.html
new = old[:]

Python老鸟都知道以上代码是什么意思。它复制列表old到new。它对于新手来说是种困惑而且应该避免使用这种方法。不幸的是[:]标记法被广泛使用,可能是Python程序员不知道更好的列表复制法吧。

首先我们需要了解Python是如何管理对象和变量。Python没有C语言中的变量。在C语言中,变量不止是个名字,它是字节集合并真实存在于内存某个位置上。而在Python中,变量仅仅是指向对象的标签。

看看以下语句:

a = [1, 2, 3]

它表示我们创建了一个指引指向列表[1, 2, 3],但是a不是列表。如果:

b = a

我们并没有复制a所指引的列表。我们只是创建了一个新的标签b,然后将其指向a所指向的列表。

如果你修改a,那你就同时修改了b,因为它们指向同一个列表:

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> print a
[1, 2, 3, 4]
>>> print b
[1, 2, 3, 4]

内建函数id()可以返回对象的唯一id。该id是对象的内存地址。

>>> id(a)
3086056
>>> id(b)
3086056
>>> c = [] # Create a new list
>>> id(c)
2946712

可以看出a和b都指向同一个内存地址。c指向一个新建的空列表,因此指向了不同的地址。

现在我们要复制a指引的列表。我们必须创建新的列表,然后使用b指引它。

这其实就是 new = old[:]。切片运算符[:]返回一个序列的切片。切片过程是切下列表的一部分,创建新的列表,将切下的部分复制到新列表。

>>> a[1:3]
[2, 3]
>>> id(a)
3086056
>>> id(a[1:3])
3063400

省略第一个索引值,切片从列表开始,省略第二个索引值,切片直到列表末端。

>>> a[:3]
[1, 2, 3]
>>> a[1:]
[2, 3, 4]

通过调用a[:],我们得到一个从列表首端开始到末端的切片,也就是a(指引的列表)的完整复制。但这不是复制列表的唯一方式。看看下面这个情况:

>>> b = list(a)
>>> id(a)
3086056
>>> id(b)
3086256

这个是不是看起来更好,少一些隐式,更加pythonic?a[:]看起来有点太像Perl。不同于切片标记法,不了解Python的人也会明白b是一个列表。

list()是列表构造函数。它会在传入的数列基础上新建一个列表。数列不一定是列表,它可以是任何类型的数列。

>>> my_tuple = (1, 2, 3)
>>> my_list = list(my_tuple)
>>> print my_list
[1, 2, 3]
>>> id(my_tuple)
3084496
>>> id(my_list)
3086336

而且它还接受生成器。切片笔记法不适用于生成器,因为生成器是不可更改。你不能generator[0],例如:

>>> generator = (x * 3 for x in range(4))
>>> list(generator)
[0, 3, 6, 9]

百分之九十的切片标记法都可以被list()代替。下次你看见[:]的时候试试使用list()替代,这样可以让你的代码更加可读。记住,魔鬼藏在细节里。

附:五种复制方法的比较

>>> import copy
>>> a = [[10], 20]
>>> b = a[:]
>>> c = list(a)
>>> d = a * 1
>>> e = copy.copy(a)
>>> f = copy.deepcopy(a)
>>> a.append(21)
>>> a[0].append(11)
>>> print id(a), a
30553152 [[10, 11], 20, 21]
>>> print id(b), b
44969816 [[10, 11], 20]
>>> print id(c), c
44855664 [[10, 11], 20]
>>> print id(d), d
44971832 [[10, 11], 20]
>>> print id(e), e
44833088 [[10, 11], 20]
>>> print id(f), f
44834648 [[10], 20]

从以上可以看出,使用 a[:], list(a), a*1, copy.copy(a)四种方式复制列表结果都可以得到一个新的列表,但是如果列表中含有列表,所有b, c, d, e四个新列表的子列表都是指引到同一个对象上。只有使用copy.deepcopy(a)方法得到的新列表f才是包括子列表在内的完全复制。

python : 正确复制列表的方法相关推荐

  1. [Python] 正确复制列表的方法

    new = old[:] Python老鸟都知道以上代码是什么意思.它复制列表old到new.它对于新手来说是种困惑而且应该避免使用这种方法.不幸的是[:]标记法被广泛使用,可能是Python程序员不 ...

  2. 巧用Python:用Python批量复制文件,方法有9种,方便快捷

    当我们复制一个文件时用复制粘贴就可以了,如果是多个文件呢?就会很麻烦了,今天给大家介绍一下用Python批量复制文件,方法有九种!希望对你有帮助 1. Shutil Copyfile()方法 该方法只 ...

  3. python遍历是什么意思_在Python中遍历列表的方法有哪些

    Python中遍历列表有以下几种方法: 一.for循环遍历lists = ["m1", 1900, "m2", 2000] for item in lists: ...

  4. 【python】 合并列表的方法

    python中利用非循环的方法将两个List列表中的内容进行合并 在处理字符串.目录和排序信息的时候,经常需要将两个列表进行合并.但利用for循环逐个插入会十分繁琐,利用下面的方法可以快速方便的进行列 ...

  5. python深度复制列表_Python-如何深层复制列表?

    我对列表副本有一些问题: 所以之后我得到了E0来自'get_edge',我做的副本E0通过调用'E0_copy = list(E0)'.我猜这里E0_copy是的较深的副本E0,我通过E0_copy了 ...

  6. Python入门(8)——列表

    列表的定义 列表是由一系列按特定顺序排列的元素组成. 列表可以包含不同类型的元素.列表内元素的值可以重复. 列表通常用单词名称的复数表示. 列表用方括号[]表示,元素用,隔开. >>> ...

  7. 零基础Python完全自学教程15:Python中的列表

    欢迎你来到站长学堂,学习站长在线出品的在线课程<零基础 Python完全自学教程>今天给大家分享的是第14课< Python中的列表 >.本节课是一个大课,我分了这些知识点进行 ...

  8. Python 文件复制

    Python 文件复制有好多方法,以下记录最简单的一种. 以下代码中,第一个'sorted.xlsx'为源文件,第2个路径为目标文件,当目标文件的路径中含有ip地址的时候,需要加上"\\&q ...

  9. 这12种方法轻松合并Python中的列表

    我喜欢12这个数字,因为有太多的事情与12有关.一年有12个月;古代用12个时辰(地支)表示一天的时间.用一纪表示12年;希腊有12主神;黄道有12宫;撒迦利亚.西琴先生的<地球编年史>中 ...

最新文章

  1. oracle与join相反的函数,ORACLE JOIN 与 +
  2. 【前沿技术】Facebook 硬件负责人,带摄像头的智能眼镜将在 10 年内成为常态
  3. ORACLE了局,每天10问(二)
  4. android配置文件说明
  5. Winform将网页生成图片
  6. 图论--最短路-- Dijkstra模板(目前见到的最好用的)
  7. androidstudio 日历视图怎么显示农历_中秋国庆旅游攻略怎么做?用这个便签软件很简单...
  8. mysql catalog def_在ArcCatalog里如何连接数据库-百度经验
  9. 中科院计算机技术研究所张浩,中国科学院计算技术研究所 韩 琥 博士
  10. C#WPF内存回收与释放LierdaCracker
  11. VS解决方案文件格式说明
  12. android octet stream,Java MimetypesFileTypeMap始终在Android模拟器上返回application/octet-stream...
  13. BJDCTF_2nd PWN复盘
  14. 记一次艰苦的刷机历程,nexus7 刷cm12 nightly版,刷入gapps
  15. 线性方程组6种数值解法的对比研究
  16. 存储中所说的蓝光和磁带库
  17. SSD性能测试工具-AS_SSD Benchmark
  18. 等待面试结果焦虑_在技​​术面试中进行实时编码时,您如何应对焦虑?
  19. 【HTML 教程】网页元素的属性
  20. 风控红宝书重磅上市!技术和业务双维度揭秘风控与反欺诈

热门文章

  1. 150分试卷c语言,连续5道C语言题目一共送150分啊,题目2.一个农场有头母牛,现 爱问知识人...
  2. java服务器项目,java项目服务器部署
  3. django在window和linux,从windows导入Django项目到linux时出错
  4. 华为智慧屏云会议怎么操作_像玩手机一样玩转车机,华为智选车载智慧屏是怎么做到的?...
  5. 编译原理第三版王生原pdf_CS143:编译原理 | 环境搭建HelloWorld
  6. 可用子网数要不要减2_子网数、主机数与子网掩码的关系
  7. 循环在c语言中的表示什么作用,《C语言中的for循环》教案
  8. 顺德职业技术学院计算机专业录取线,顺德职业技术学院录取分数线2021是多少分(附历年录取分数线)...
  9. xsd 生成 java 类_如何从Java类生成XSD
  10. 斯威夫特山地车_斯威夫特字典