博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第5条:了解切割序列的办法
阅读量:5368 次
发布时间:2019-06-15

本文共 2178 字,大约阅读时间需要 7 分钟。

核心知识点:

1.不要写多余的代码:切片的起止索引为0时,有时候使用负值更方便,应该省略;

2.切片不会计较起止索引是否越界;

3.使用切片对列表负值,系统不会考虑范围的长度;

4.更改浅拷贝生产的列表,不会对原列表产生影响,反之,则不同。

 

Python提供了一种把序列切成小块的写法。这种切片(slice)操作,使得开发者可以轻易的访问由序列中的某些元素所构成的子集。

最简单的用法就是对内置的list、str和bytes进行切割。

切割的基本写法时somelist[start:end],其中start(起始索引)所指的元素覆盖在切割后的范围内,而end(结束索引)所指的元素不包括在切割结果之中。

>>> a = ['a','b','c','d','e','f','g','h','i']>>> print('First four:',a[:4])First four: ['a', 'b', 'c', 'd']>>> print('last four:',a[-4:])last four: ['f', 'g', 'h', 'i']>>> print('Middle three:',a[3:-3])Middle three: ['d', 'e', 'f']#这里我之所以会多此一举的使用print,我想提醒大家一个概念#在python解释其中,我们并没有打印,而结果输出了,那是python解释器帮我们执行了print操作。

 

如果从列表开头获取切片,那就不要在start那里写上0,而是应该把它留空,这样代码会看起来清爽一些。

同样的如果切片一直要取到列表末尾,也要把end留空,因为即便写了也是多余的。

很多时候我们使用负值来表示索引的位置,会显得简单和直白。

 

切割列表的时候,即便start或end索引越界也不会出现任何问题。利用这一特性,我们可以限定输入序列的最大长度。

>>> print('All:',a[:20])All: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']>>> print('All:',a[-20:])All: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

 

但是访问单个元素时,下标不能越界,否则就会出现异常。

>>> a[20]Traceback (most recent call last):  File "
", line 1, in
IndexError: list index out of range

 

原表进行切割之后,会产生另外一份全新的列表。系统依然维护着指向原列表中各个对象的引用

在切割后得到的列表上进行修改,不会影响原列表。

>>> b = a[4:]>>> print('Before:',b)Before: ['e', 'f', 'g', 'h', 'i']>>> b[1] = 99>>> print('After:',b)After: ['e', 99, 'g', 'h', 'i']>>> print('No change:',a)No change: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

 

在赋值时对左侧列表使用切割操作,会把该列表中处在指定范围内的对象替换为新值。

与元祖(tuple)的赋值(如a,b =c[:2])不同(元祖不能改变),此切片的长度无需与新值的个数相等,

位于切片范围之前及之后的那些值都保持不变。列表会根据新值的个数相应的扩张或收缩。

>>> print('Before',a)Before ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']>>> a[2:7] = [99,22,14]>>> print('After',a)After ['a', 'b', 99, 22, 14, 'h', 'i']

 

如果对赋值操作右侧的列表使用切片,而把切片的起止索引都留空,那么就会产生一份对原列表的拷贝。

>>> b = a[:]>>> print(a == b)  #浅拷贝True>>> print(a is b)False

关于深浅拷贝的博客:http://www.cnblogs.com/yangmingxianshen/p/7730303.html

 

如果对赋值操作左侧的列表使用切片,而又没有指定起止索引,那么系统会把右侧的新值赋值一份,

并用这份拷贝来替换掉左侧列表的全部内容,而不会重新分配新的列表。

>>> b = a>>> print('Berofe',a)Berofe ['a', 'b', 99, 22, 14, 'h', 'i']>>> a[:] = [102,103,104]>>> print('After',a)After [102, 103, 104]>>> print('After',b)After [102, 103, 104]  #b还是指向a

 

转载于:https://www.cnblogs.com/yangmingxianshen/p/7990711.html

你可能感兴趣的文章
数据库第1,2,3范式学习
查看>>
《Linux内核设计与实现》第四章学习笔记
查看>>
Docker 安装MySQL5.7(三)
查看>>
CSS: caption-side 属性
查看>>
CSS3中box-sizing的理解
查看>>
linux下编译安装nginx
查看>>
DLL 导出函数
查看>>
windows超过最大连接数解决命令
查看>>
12个大调都是什么
查看>>
angular、jquery、vue 的区别与联系
查看>>
Intellij idea创建javaWeb以及Servlet简单实现
查看>>
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>
【VS开发】ATL辅助COM组件开发
查看>>
FlatBuffers In Android
查看>>
《演说之禅》I & II 读书笔记
查看>>
thinkphp3.2接入支付宝支付接口(PC端)
查看>>
【转】在Eclipse中安装和使用TFS插件
查看>>