这篇文章主要给大家介绍了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中文网其他相关文章!