python 下标越界_切片python字符串时 为何不会引起下标越界?

这里涉及到切片对象slice:

a = '0123456789'

r = slice(-100, 100) # -100:100

a_new = a[r] # 取缺省值a[:]

print(a_new, a[:])

r = slice(100, 200) # 100:200

a_new = a[r] # 取缺省值a[len(a):len(a)]

print(a_new, a[len(a):len(a)])

list 中的具体处理方式:

/* 取自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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值