首页  >  文章  >  后端开发  >  关于Sequence切片的下标问题及解决方法

关于Sequence切片的下标问题及解决方法

零下一度
零下一度原创
2017-06-17 11:00:021151浏览

这篇文章主要给大家介绍了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 3afdfebecaa5e3de587ff801d76a6de0sq_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