這篇文章主要為大家介紹了Python中關於Sequence切片下標問題的相關資料,文中透過範例程式碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
前言
在python中, 切片是一個經常會使用到的語法, 不管是元組, 列表還是字串, 一般語法就是:
sequence[ilow:ihigh:step] # ihigh
,step 可為空; 為了簡短易懂, 暫時排除step的用法考慮
先來簡單示範下用法
sequence = [1,2,3,4,5] sequence [ilow:ihigh] # 从ilow开始到ihigh-1结束 sequence [ilow:] # 从ilow开始直到末尾 sequence [:ihigh] # 从头部开始直到ihigh结束 sequence [:] # 复制整个列表
語法很簡潔, 也很容易理解, 這種文法在我們日常使用中是簡單又好用, 但我相信在我們使用這種切片語法時, 都會習慣性謹遵一些規則:
ilow, ihigh均小於sequece的長度
ilow 259d702acfa94061b1fa70f117e0fa6csq_slice(s, i1, i2) , 但是這個sq_slice有點特別, 因為不同的物件, 它所對應的函數不同, 下面是各自的對應函數:
// 字符串对象 StringObject.c: (ssizessizeargfunc)string_slice, /*sq_slice*/ // 列表对象 ListObject.c: (ssizessizeargfunc)list_slice, /* sq_slice */ // 元组 TupleObject.c: (ssizessizeargfunc)tupleslice, /* sq_slice */
因為他們三個的函數實現大致相同, 所以我們只分析其中一個就可以了, 下面是對列表的切片函數分析:
/* 取自ListObject.c */ static PyObject * list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh) { PyListObject *np; PyObject **src, **dest; Py_ssize_t i, len; if (ilow < 0) ilow = 0; else if (ilow > Py_SIZE(a)) // 如果ilow大于a长度, 那么重新赋值为a的长度 ilow = Py_SIZE(a); if (ihigh < ilow) ihigh = ilow; else if (ihigh > Py_SIZE(a)) // 如果ihigh大于a长度, 那么重新赋值为a的长度 ihigh = Py_SIZE(a); len = ihigh - ilow; np = (PyListObject *) PyList_New(len); // 创建一个ihigh - ilow的新列表对象 if (np == NULL) return NULL; src = a->ob_item + ilow; dest = np->ob_item; for (i = 0; i < len; i++) { // 将a处于该范围内的成员, 添加到新列表对象 PyObject *v = src[i]; Py_INCREF(v); dest[i] = v; } return (PyObject *)np; }
結論
從上面的sq_slice函數對應的切片函數可以看到, 如果在使用切片時, 左右下標都大於sequence的長度時, 都將會被重新賦值成sequence的長度, 所以咱們一開始的切片: print a[10:20]
, 實際上運行的是: print a4:4
. 透過這次的分析, 以後在遇到下標大於物件長度的切片, 應該不會再懵逼了~
以上是關於Sequence切片的下標問題及解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!