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


猜你喜欢
- SQL Server从2005起开始支持xml类型,这个数据类型对于后期的改变非常有用。一对多的关系在后期变成了多对多的关系,XML类型就是
- 目录演示地址:关于程序开发环境资源和依赖包NASA TV feed 流Python第三方库完整代码演示地址:https://replit.c
- k-近邻算法概述简单地说,k近邻算法采用测量不同特征值之间的距离方法进行分类。k-近邻算法优点:精度高、对异常值不敏感、无数据输入假定。缺点
- 获得当前日期+时间(date + time)函数:now()mysql> select now();+----------------
- 链表的反转是一个很常见、很基础的数据结构题,输入一个单向链表,输出逆序反转后的链表,如图:上面的链表转换成下面的链表。实现链表反转有两种方式
- /* 判断指定的内容是否为空,若为空则弹出 警告框 */ function isEmpty(theValue, strMsg){ if(th
- 背景对接多个外部接口,需要保存请求参数以及返回参数,方便消息的补偿,因为多个外部接口,多个接口字段都不统一,整体使用一个大字段(longte
- 常用方法浅拷贝copya = {"ilpy1": {"company": "aaa&quo
- 如下所示:#!/usr/bin/python# -*- coding: utf-8 -*-def rever(sentence): &nbs
- 假设我们有这样一种数据:data = [ ("apple&quo
- 大致介绍Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,可以有效、高速的处理从很小到非常大的项目版本管理。
- 今天在工作中遇到了一个问题,需要按时间查询,可是查询出来的结果显示的不正确。举个例子来说,要查找出2007-10-12至2007-10-31
- vue在做大型项目时,会用到多状态管理,vuex允许我们将store分割成多个模块,每个模块内都有自己的state、mutation、act
- 锁机制NOLOCK和READPAST的区别。1. 开启一个事务执行插
- 现在的离线浏览器很多,可是多数都是共享软件,或是英文软件,这给我们的操作带来了很大的不便。其实微软的网页制作工具FrontPage XP有一
- 定义变量什么是变量?在程序运行过程中,其值可以改变的量变量的定义?在 python 中,每个变量在使用前都必须赋值,变量赋值以后该变量才会被
- 本人虽然五音不全,但是听歌还是很喜欢的。希望能利用机器自动制作音乐,本我发现了一个比较适合入门的有趣的开源音乐生成模块 PySynth ,文
- 发现上一篇文章解决了mysql服务无法启动问题后,竟然用root用户无密码不能登录,5.7版本不能在初始化时用root无密码登录,找了很多帖
- 本文实例讲述了Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能。分享给大家供大家参考,具体如下:/*** 利用php
- 使用python的numpy模块实现逻辑回归模型的代码,供大家参考,具体内容如下使用了numpy模块,pandas模块,matplotlib