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


Posted in Python onOctober 16, 2018

前言

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

对于别人也是如此.

总结

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

Python 相关文章推荐
使用Python的urllib和urllib2模块制作爬虫的实例教程
Jan 20 Python
socket + select 完成伪并发操作的实例
Aug 15 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
利用python-docx模块写批量生日邀请函
Aug 26 Python
Python中url标签使用知识点总结
Jan 16 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
python数据分析工具之 matplotlib详解
Apr 09 Python
Python使用shutil模块实现文件拷贝
Jul 31 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
Django数据库迁移常见使用方法
Nov 12 Python
用Python 执行cmd命令
Dec 18 Python
使用Python编写Prometheus监控的方法
Oct 15 #Python
python取数作为临时极大值(极小值)的方法
Oct 15 #Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 #Python
Python并行分布式框架Celery详解
Oct 15 #Python
对Python 内建函数和保留字详解
Oct 15 #Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 #Python
便捷提取python导入包的属性方法
Oct 15 #Python
You might like
PHP安全配置
2006/12/06 PHP
php常用的url处理函数总结
2014/11/19 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
js生成随机数之random函数随机示例
2013/12/20 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
node.js中的require使用详解
2014/12/15 Javascript
DOM 事件流详解
2015/01/20 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
Canvas实现微信红包照片效果
2018/08/21 Javascript
Python sys.path详细介绍
2013/10/17 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
python如何实现反向迭代
2018/03/20 Python
python 判断网络连通的实现方法
2018/04/22 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
python 同时读取多个文件的例子
2019/07/16 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
智能旅行箱:Horizn Studios
2018/04/30 全球购物
.NET常见笔试题集
2012/12/01 面试题
小学生暑假家长评语
2014/04/17 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
倡议书格式及范文
2015/04/29 职场文书
科技馆观后感
2015/06/08 职场文书
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
Nginx缓存设置案例详解
2021/09/15 Servers