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

作者:代码日志 时间:2021-08-15 01:22:05 

前言


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

对于别人也是如此.

来源:https://codeday.me/bug/20181015/290913.html

标签:复制列表,[:],[::]
0
投稿

猜你喜欢

  • IE6终极备忘单——策略

    2010-01-13 13:05:00
  • Python如何使用Gitlab API实现批量的合并分支

    2023-01-31 18:17:45
  • js打开新窗口方法代码收集

    2007-09-05 19:20:00
  • Python NumPy库安装使用笔记

    2022-05-20 17:49:56
  • Python 3.6 中使用pdfminer解析pdf文件的实现

    2023-09-02 08:34:08
  • 交互设计杂七杂八

    2010-09-25 18:41:00
  • asp实现ACCESS数据库加密方法

    2008-04-18 12:33:00
  • 使用Python的Tornado框架实现一个Web端图书展示页面

    2022-04-23 07:23:48
  • python使用re模块爬取豆瓣Top250电影

    2023-10-11 17:28:38
  • 浅谈Python反射 & 单例模式

    2023-10-14 21:16:30
  • asp清理缓存的代码

    2011-03-09 11:16:00
  • python实现堆排序的实例讲解

    2023-01-06 20:50:38
  • Python递归函数实例讲解

    2022-12-01 14:54:56
  • Python编程pytorch深度卷积神经网络AlexNet详解

    2022-02-18 10:28:40
  • Python中的for循环详情

    2022-04-11 04:30:54
  • Python pexpect模块及shell脚本except原理解析

    2022-11-10 18:52:04
  • Python 读写文件的操作代码

    2021-11-16 02:43:44
  • python删除文件、清空目录的实现方法

    2021-06-02 02:53:06
  • AJAX请求类下载

    2007-08-23 08:33:00
  • Django 登陆验证码和中间件的实现

    2021-08-12 10:26:18
  • asp之家 网络编程 m.aspxhome.com