首頁  >  文章  >  後端開發  >  關於Sequence切片的下標問題及解決方法

關於Sequence切片的下標問題及解決方法

零下一度
零下一度原創
2017-06-17 11:00:021163瀏覽

這篇文章主要為大家介紹了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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn