切片中设置的默认值是什么?

时间:2017-08-14 20:48:19

标签: python python-3.x

我查看了why-does-list-1-not-equal-listlenlist-1what-are-the-default-slice-indices-in-python-really的热门答案,了解切片中默认值的设置。两个最佳答案都参考以下文档:

给定s[i:j:k]

  

如果省略i或j或None,则它们变为“结束”值(其结束取决于k的符号)。注意,k不能为零。如果k为None,则将其视为1。

假设我有以下代码:

s = "hello"
forward_s = s[::1]
print(forward_s) # => "hello"

backward_s = s[::-1]
print(backward_s) # => "olleh"

我知道如果省略索引,那么Python会将其视为None的值在那些地方使用。根据文档,ij[i:j:k]的索引设置为“结束”值,具体取决于k的符号。对于正k,我假设i设置为0j设置为字符串的长度。为负k设置的值是多少?

例如,以下内容也会反转字符串:

reversed_str = s[-1:-6:-1]

因此i的默认值设置为-1,而j的{​​{1}}设置为-len(s) - 1

1 个答案:

答案 0 :(得分:1)

default valuesNoneNoneNone

class Sliceable(object):
    def __getitem__(self, slice):
        print(slice)

Sliceable()[::]
>>> slice(None, None, None)

这与slice()确实需要stop参数无关。库文档对此有点不那么明确,但是C API makes clear,所有三个值都可能为空:

  

startstopstep参数用作相同名称的切片对象属性的值。任何值都可以是NULL,在这种情况下,None将用于相应的属性。

它可以通过切片对象来理解默认值。约定是使用内置集合实现的第一个元素,过去的最后一个元素,最小步进:< / p>

l = [1, 2, 3]
l[slice(None, None, None])
>>> [1, 2, 3]
s[None:None:None])
>>> [1, 2, 3]

否定步进将导致默认startend值在语义上反转,即:

s = 'abc'
s[slice(None, None, -1)]
>>> 'cba'
s[::-1]
>>> 'cba'

请注意,这并不意味着简单的值翻转,end的默认值通常是&#34; 一个超过序列结尾的任何方向&#34 ;,因为range()不包括结束值,但切片的默认值应包括完整序列。

记录在案here

  

s[i:j:k]

     

sij的切片k被定义为索引为x = i + n*k的项目序列,0 <= n < (j-i)/k }。换句话说,索引为i, i+k, i+2*k, i+3*k,依此类推,在达到j时停止(但从不包括j)。如果k为正数,则ij会缩小为len(s)。当k为否定时,ij如果更高则会减少为len(s) - 1。如果省略ij或无,则它们将成为“结束”值(结束取决于k的符号)。请注意,k不能为零。如果kNone,则会将其视为1