当在Python中使用负数切字符串时,是否禁用0?

Sin*_*nux 4 python python-2.7 python-3.x

假设我有一个字符串:

>>>a = 'akwkwas'
>>>
>>>a[-3:]
'was'
>>>a[-3:None]
'was'
>>>a[-3:0]
''
Run Code Online (Sandbox Code Playgroud)

为什么不能将其0用作切片的结尾?

这是从文档:

记住分片工作方式的一种方法是将索引视为指向字符之间的指针,第一个字符的左边缘编号为0。然后,由n个字符组成的字符串的最后一个字符的右边缘具有索引n,例如:

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1
Run Code Online (Sandbox Code Playgroud)

数字的第一行给出索引0 ... 6在字符串中的位置;第二行给出相应的负索引。从i到j的切片由分别标记为i和j的边之间的所有字符组成。

因此,当我们在loop中使用负索引时,应该检查结尾的值,因为0负索引的结尾不存在,例如,当我们将字符串拆分为类似于金钱的字符串时:

>>>a = '12349878334'
>>>print(','.join([a[-i-3:-i if i else None] for i in range(0, len(a), 3)][::-1])) 
>>>12,349,878,334
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

0序列的开始。始终,毫不含糊。将其含义有时更改为结尾会导致很多混乱,尤其是在对这两个值使用变量时。

使用负索引也不是不同的方式。负索引将相对于长度转换为正索引。更改元素0指的是因为另一个片段输入(开始或停止)为负数是没有意义的。

因为0总是表示序列的第一个元素,并且没有拼写为负的零,所以您不能0用来表示序列的结尾。

如果您需要参数化索引,则可以将其None用作stop表示此的元素:

start = -3
stop = None
result = a[start:stop]
Run Code Online (Sandbox Code Playgroud)

您也可以创建一个slice()对象 ; 同样的规则适用于如何解释索引:

indices = slice(-3, None)
result = a[indices]
Run Code Online (Sandbox Code Playgroud)

实际上,解释器将切片符号转换为slice()对象,然后将其传递给对象以区别于使用单个整数的向上索引。该a[start:stop]符号转化为type(a).__getitem__(a, slice(start, stop))a[42]type(a).__getitem__(a, 42)

因此,通过使用slice()对象,您可以使用单个变量记录切片或单元素索引。