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实现竖排打印传单手机号码易撕条
Mar 16 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
django启动uwsgi报错的解决方法
Apr 08 Python
django 修改server端口号的方法
May 14 Python
基于Python List的赋值方法
Jun 23 Python
python读取word文档,插入mysql数据库的示例代码
Nov 07 Python
Python的log日志功能及设置方法
Jul 11 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
Nov 20 Python
基于Python 中函数的 收集参数 机制
Dec 21 Python
Python requests模块cookie实例解析
Apr 14 Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 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
星际玩家的三大定律
2020/03/04 星际争霸
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
php 文件上传类代码
2011/08/06 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
取键盘键位ASCII码的网页
2007/07/30 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
jquery利用命名空间移除绑定事件的方法
2015/03/11 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
在Python中使用Mako模版库的简单教程
2015/04/08 Python
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
Python多层装饰器用法实例分析
2018/02/09 Python
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
实习自我鉴定模板
2013/09/28 职场文书
办理信用卡工作证明
2014/01/11 职场文书
2014社区三八妇女节活动总结
2014/03/01 职场文书
企业年会主持词
2014/03/27 职场文书
初中班主任寄语
2014/04/04 职场文书
巾帼文明岗申报材料
2014/05/01 职场文书
会计求职自荐信
2014/06/20 职场文书
2014年营业员工作总结
2014/11/18 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
部门2015年度工作总结
2015/04/29 职场文书
小学运动会通讯稿
2015/07/18 职场文书
python套接字socket通信
2022/04/01 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python