python复制列表时[:]和[::]之间有什么区别

前言

new = old[:]

Python老鸟都知道以上代码是什么意思。它复制列表old到new。它对于新手来说是种困惑而且应该避免使用这种方法。不幸的是[:]标记法被广泛使用,可能是Python程序员不知道更好的列表复制法吧。然而本文给大家介绍的是关于python复制列表时[:]和[::]之间有什么区别,下面来一起看看吧

我们可以(浅)使用[:]复制列表:

l = [1, 2, 3]
z1 = l[:]

我们也可以(浅)使用[::]复制它:

z2 = [::]

现在z1 == z2将为True.在Explain Python's slice notation阅读答案后,我了解这些图片的工作原理.

但是,我的问题是这两个内部是否有区别?在复制中比其他效率更高,还是做完全相同的事情?

最佳答案

他们之间绝对没有区别,至少在Python 3中.如果你愿意,可以使用dis.dis来检查每个这些使用的字节码:

l = [1, 2, 3, 4]

针对l [:]发出的字节码:

from dis import dis
dis('l[:]')
 1   0 LOAD_NAME    0 (l)
    3 LOAD_CONST    0 (None)
    6 LOAD_CONST    0 (None)
    9 BUILD_SLICE    2
    12 BINARY_SUBSCR
    13 RETURN_VALUE

而为l [::]发送的字节码:

dis('l[::]')
 1   0 LOAD_NAME    0 (l)
    3 LOAD_CONST    0 (None)
    6 LOAD_CONST    0 (None)
    9 BUILD_SLICE    2
    12 BINARY_SUBSCR
    13 RETURN_VALUE

你可以看到,它们完全一样.对于构建切片(BUILD_SLICE)的起始和停止值都加载一些无(两个LOAD_CONSTS),并应用它. NONE是Standard Type hierarchy中切片文档中所述的默认值:

Special read-only attributes: start is the lower bound; stop is the upper bound; step is the step value; each is None if omitted. These attributes can have any type.

使用[:],它的键击少.

实际上有趣的是,在Python 2.x中,生成的字节代码是不同的,由于l [:]的命令较少,可能会稍微更高效:

>>> def foo():
...  l[:]
...
>>> dis(foo)
 2   0 LOAD_GLOBAL    0 (l)
    3 SLICE+0
    4 POP_TOP
    5 LOAD_CONST    0 (None)
    8 RETURN_VALUE 

而对于l [::]:

>>> def foo2():
...  l[::]
...
>>> dis(foo2)
 2   0 LOAD_GLOBAL    0 (l)
    3 LOAD_CONST    0 (None)
    6 LOAD_CONST    0 (None)
    9 LOAD_CONST    0 (None)
    12 BUILD_SLICE    3
    15 BINARY_SUBSCR
    16 POP_TOP
    17 LOAD_CONST    0 (None)
    20 RETURN_VALUE 

即使我没有定时这些(我不会,差异应该很小)看起来,由于只需要更少的指示,l [:]可能稍微好一点.

这种相似性当然不存在于列表中;它适用于Python中的所有序列:

# Note: the Bytecode class exists in Py > 3.4
>>> from dis import Bytecode
>>>
>>> Bytecode('(1, 2, 3)[:]').dis() == Bytecode('(1, 2, 3)[::]').dis()
True
>>> Bytecode('"string"[:]').dis() == Bytecode('"string"[::]').dis()
True

对于别人也是如此.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 复制粘贴功能的Python程序

    今天因为给BeauBeau提供的抽奖号码做SQL文件,一开始收到ZIP文件解开压缩之后被吓到了--29个CSV文件,每个文件保存了1000个奖券ID和号码-_-! 照上次一样,打开每个CSV文件做先做单独的SQL文件,每个SQL中有1000条插入语句,随后将29个文件的所有SQL语句都复制粘贴到同一个总的SQL文件中. CSV文件中的结构是"ID,NUMBER"的结构,其中ID是7位数字,NUMBER是11位数字.这样用正则式来进行捕捉的时候就比较方便了,在Eclipse的查找/替换功

  • python实现复制整个目录的方法

    本文实例讲述了python实现复制整个目录的方法.分享给大家供大家参考.具体分析如下: python有一个非常好用的目录操作类库shutil,通过这个库可以很简单的复制整个目录及目录下的文件 import shutil #复制文件 shutil.copyfile('listfile.py', 'd:/test.py') #复制目录 shutil.copytree('d:/temp', 'c:/temp/') #其余可以参考shutil下的函数 希望本文所述对大家的Python程序设计有所帮助.

  • python数组复制拷贝的实现方法

    本文实例讲述了python数组复制拷贝的实现方法.分享给大家供大家参考.具体分析如下: python中直接通过等号赋值实际上只是引用地址的传递 如: a = [1,2,3,4,5] b=a 当a的值改变时,b的值也会随之改变 如果希望b和a没有关系,可以通过下面的方法 a = [1,2,3,4,5] b=a[:] 这样a和b就是两个完全独立的数组,互相不会影响 希望本文所述对大家的Python程序设计有所帮助.

  • Python复制文件操作实例详解

    本文实例讲述了Python复制文件操作用法.分享给大家供大家参考,具体如下: 这里用python实现了一个小型的自动发版本的工具.这个"自动发版本"有点虚, 只是简单地把debug 目录下的配置文件复制到指定目录,把Release下的生成文件复制到同一指定,过滤掉不需要的文件夹(.svn),然后再往这个指定目录添加几个特定的文件. 这个是我的第一个python小程序. 下面就来看其代码的实现. 首先插入必要的库: import os import os.path import shut

  • python复制文件的方法实例详解

    本文实例讲述了python复制文件的方法.分享给大家供大家参考.具体分析如下: 这里涉及Python复制文件在实际操作方案中的实际应用以及Python复制文件 的相关代码说明,希望你会有所收获. Python复制文件: import shutil import os import os.path src = " d:\\download\\test\\myfile1.txt " dst = " d:\\download\\test\\myfile2.txt " ds

  • python复制文件代码实现

    主要功能在copyFiles()函数里实现,如下: 复制代码 代码如下: def copyFiles(src, dst):    srcFiles = os.listdir(src)    dstFiles = dict(map(lambda x:[x, ''], os.listdir(dst)))    filesCopiedNum = 0 # 对源文件夹中的每个文件若不存在于目的文件夹则复制    for file in srcFiles:        src_path = os.path

  • python复制列表时[:]和[::]之间有什么区别

    前言 new = old[:] Python老鸟都知道以上代码是什么意思.它复制列表old到new.它对于新手来说是种困惑而且应该避免使用这种方法.不幸的是[:]标记法被广泛使用,可能是Python程序员不知道更好的列表复制法吧.然而本文给大家介绍的是关于python复制列表时[:]和[::]之间有什么区别,下面来一起看看吧 我们可以(浅)使用[:]复制列表: l = [1, 2, 3] z1 = l[:] 我们也可以(浅)使用[::]复制它: z2 = [::] 现在z1 == z2将为Tru

  • Python遍历列表时删除元素案例

    tk在科学养猪群里问bluerust.scz是否碰上过这个Python坑, 示例1: bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5' ] for ba in bas : print( ba ) if ( ba.find( 'ba' ) != -1 ) : bas.remove( ba ) print( bas ) print( bas ) 即遍历list的过程中动态删除元素. 上述代码输出如下: ba1 ['ba2', 'ba3', 'ba4', 'ba5']

  • 详解Python遍历列表时删除元素的正确做法

    一.问题描述 这是在工作中遇到的一段代码,原理大概和下面类似(判断某一个元素是否符合要求,不符合删除该元素,最后得到符合要求的列表): a = [1,2,3,4,5,6,7,8] for i in a: if i>5: pass else: a.remove(i) print(a) 运行结果: 二.问题分析 因为删除元素后,整个列表的元素会往前移动,而i却是在最初就已经确定了,是不断增大的,所以并不能得到想要的结果. 三.解决方法 1.遍历在新的列表操作,删除是在原来的列表操作 a = [1,2

  • Python中列表,元组,字典和集合的区别及它们之间的转换

    目录 (1)集合set (2)元组tuple (3)列表list (4)字典dict 下面是一些小例子 字典的分割.合并 list分割.合并 前排提示:元祖是错误的写法(带错别字),部分文章写为元祖系误,正确的说法为元组. 首先了解序列. 序列是具有先后关系的一组元素,它是一维元素向量,元素类型可以不同. 元素间由序号引导,通过下标访问序列的特定元素. 序列是一个基类类型,元组.列表是序列类型的一种扩展,继承序列类型的全部通用操作. (1)集合set 集合就是我们数学学的集合,集合最好的应用是去

  • 解决python文件字符串转列表时遇到空行的问题

    文件内容如下: Alex 100000 Rain 80000 Egon 50000 Yuan 30000 #此处有一个空行! 现在看如何处理并转成列表! salary_info = open("salaryinfo.txt", "r+", encoding="UTF-8") salary_info_list = [] for line in salary_info.readlines(): if line == '\n': pass else:

  • python实现在遍历列表时,直接对dict元素增加字段的方法

    example: for item in warehouse_list: warehouse_id = item['warehouse_id'] warehouse = Warehouse.objects.get(id=warehouse_id) item['warehouse_owner_id'] = warehouse.owner_id item['warehouse_name'] = warehouse.warehouse_name 这个功能实在太强大了,python好棒. 以上这篇pyt

  • 解决python给列表里添加字典时被最后一个覆盖的问题

    如下所示: >>> item={} ; items=[] #先声明一个字典和一个列表,字典用来添加到列表里面 >>> item['index']=1 #给字典赋值 >>> items.append(item) >>> items [{'index': 1}] #添加到列表里面复合预期 >>> item['index']=2 #现在修改字典 >>> item {'index': 2} #修改成功 &g

  • 基于python 将列表作为参数传入函数时的测试与理解

    将一个列表传入函数后,会对这个列表本身产生什么改变? 这就是本文主要考察的内容. list = [1,2,3,4,5,6,7] word = list.pop(0) print(word) print(list) # 输出结果理所当然地为: # 1 # [2, 3, 4, 5, 6, 7] # def a(temp): b = temp.pop(0) print(b) print(temp) a(list) # 输出结果为: # 2 # [3, 4, 5, 6, 7] # 此处,传给temp时,

  • python切片复制列表的知识点详解

    1.不指定开始和结束的索引[:],这样得到的切片就可以包含整个列表,然后给切片一个新的变量,从而实现复制列表. 2.创建原始列表的副本,两个列表的操作不会影响. 实例 names = ["Jerry", "Tom"] names_copy = names[:] names.append("Ann") names_copy.append("Bob") print(f"names:{names}") print

  • Python判断列表是否已排序的各种方法及其性能分析

    声明 本文基于Python2.7语言,给出判断列表是否已排序的多种方法,并在作者的Windows XP主机(Pentium G630 2.7GHz主频2GB内存)上对比和分析其性能表现. 一. 问题提出 Haskell培训老师提出一个问题:如何判断列表是否已经排序? 排序与否实际只是相邻元素间的某种二元关系,即a->a->Bool.所以第一步可以把二元组列表找出来:第二步是把这个函数作用于每个元组,然后用and操作.老师给出的实现代码如下: pair lst = zip lst ( tail

随机推荐