Python中list的切片細節
Python中的切片功能強大。但是切片很容易讓人搞混。
個人覺得Python的文件不怎麼好,好多東西都是零散的,更像教科書。
下面的參考來自Python3.2文件和Python參考手冊(第4版):
a = [1,2,3,4]
x = a[1:2] #a.__getitem__(slice(1,2,None))
slice([start], stop[, step])
Return a slice object representing the set of indices specified by range(start, stop, step). The start and step arguments default to None. Slice objects have read-only data attributes start, stop and step which merely return the argument values (or their default). They have no other explicit functionality; however they are used by Numerical Python and other third party extensions. Slice objects are also generated when extended indexing syntax is used. For example: a[start:stop:step] or a[start:stop, i]. See itertools.islice() for an alternate version that returns an iterator.
range([start], stop[, step])
This is a versatile function to create iterables yielding arithmetic progressions. It is most often used in for loops. The arguments must be integers. If the step argument is omitted, it defaults to 1. If the start argument is omitted, it defaults to 0. The full form returns an iterable of integers [start, start + step, start + 2 * step, …]. If step is positive, the last element is the largest start + i * step less than stop; if step is negative, the last element is the smallest start + i * step greater than stop. step must not be zero (or else ValueError is raised).
可以看到,list的切片,內部是呼叫__getitem__,和slice函式。而slice函式又是和range()函式相關的。
range([start], stop[, step])
[start, start + step, start + 2 * step, …]
真正讓人迷惑的是list[start:stop:step]中的start和stop的預設值。
按《Python參考手冊(第4版)》的說法:
如果不指定start和stop具體值
當step>0時,start和stop預設值是索引的開頭
當step<0時,start和stop預設值是索引的結尾
我仔細再想下,發現有點不妥,a[::-1]又怎樣解釋?
我覺得step的符號表示一種方向的含義:
+:即從左向右看,所以start預設是0,stop預設是索引最大值
– :即從右向左看,所以start預設是索引最大值,stop預設是0
如:
a = [0,1,2,3,4,5,6,7,8,9]
a[:5:-1] #step < 0,所以start = 9
a[0:5:-1] #指定了start = 0
a[1::-1] #step < 0,所以stop = 0
Python3程式碼:
l = list(range(10))
print(l[5:0:-1])
print(l[5:4:-1])
print(l[:3:-1])
print(l[0:3:-1])
print(l[9::-1])
輸出:
[5, 4, 3, 2, 1]
[5]
[9, 8, 7, 6, 5, 4]
[]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
相關文章
- python中list切片詳解Python
- python 切片獲取list、tuple中的元素Python
- python中的字串切片Python字串
- Java小細節:List可以add(null)嗎?JavaNull
- oracle中update的細節Oracle
- Python3之字串str、列表list、元組tuple的切片操作Python字串
- Python入門細節Python
- Python進階細節Python
- 微課|中學生可以這樣學Python(5.8.2節):使用切片修改列表Python
- Python中list的遍歷Python
- Python 中的反轉字串:reversed()、切片等Python字串
- 在C++中實現Python的切片C++Python
- Java面試-List中的sort詳細解讀Java面試
- python的特性 – 切片Python
- TCP 中的兩個細節點TCP
- python包匯入細節Python
- python中的list、tuple和dictionaryPython
- 微課|中學生可以這樣學Python(5.8.1節):使用切片訪問列表元素Python
- 筆記——Android 中的小細節筆記Android
- Python——基礎知識細節Python
- python中list的各種方法使用Python
- Python中的 List Comprehension 以及 GeneratorPython
- Python中清空list的幾種方法Python
- Go中的切片SliceGo
- python字串切片Python字串
- python中list有哪些方法Python
- PHP7中需要記住的細節PHP
- python中sorted()和list.sort()的用法Python
- 109-Python中列表索引和切片Python索引
- PyThon numpy中array如何轉list?Python
- Python列表切片操作Python
- python切片處理Python
- python切片詳解Python
- Java 異常處理中的種種細節!Java
- 詳解APP介面設計中的微妙細節APP
- 那些蘋果、谷歌、微軟系統中的魔鬼細節蘋果谷歌微軟
- python中的list,tuple,set和dict(參考python文件)Python
- Python中的List物件(《Python原始碼剖析》筆記四)Python物件原始碼筆記