python slice() 函数与切片表示法 - 如何处理 slice() 中的空值?



文档涵盖了slice()对象的3种用法:

  • obj[:stop]=obj[slice(stop)]
  • obj[start:stop]=obj[slice(start, stop)]
  • obj[start:stop:step]=obj[slice(start, stop, step)]

但是当我事先不知道物体的长度时,该怎么做呢?将stop设置为非常高的值,例如2E32-1

  • obj[start:]=obj[slice(start, 2E32-1)]
  • obj[:]=obj[slice(2E32-1)]

您可以将stop参数设置为None无限期继续。

obj = [1, 2, 3, 4]
obj[2:] == obj[slice(2, None)]
# == [3, 4]
obj[:] == obj[slice(None, None)]
# == [1, 2, 3, 4]
obj[::2] == obj[slice(None, None, 2)]
# == [1, 3]

您可以使用Python的slice()函数以及切片符号提供的所有功能。在内部,slice()函数和切片表示法都使用slice对象。

切片表示法your_list[start:stop:step]中,传递空值,可以通过将该值作为None传递来获得等效的slice函数slice(start, stop, step)。例如:

  • 仅使用空endstart

    >>> my_list = list(range(10))  # for demonstration purpose
    # start: `5`
    # end: empty - meaning end of the list
    >>> my_list[5:]
    [5, 6, 7, 8, 9]
    # use `end` as `None`
    >>> my_list[slice(5, None)]  
    [5, 6, 7, 8, 9]
    
  • 仅使用空startend

    >>> my_list[:5]
    [0, 1, 2, 3, 4]
    >>> my_list[slice(5)]
    [0, 1, 2, 3, 4]
    # OR
    >>> my_list[slice(None, 5)]
    [0, 1, 2, 3, 4]
    
  • startend都为空(列表副本)

    >>> my_list[:]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> my_list[slice(None, None)]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

再举几个例子:

# with both `start` and `end`
>>> my_list[2:5]
[2, 3, 4]
>>> my_list[slice(2, 5)]
[2, 3, 4]
# with `start`, `end` and `step`
>>> my_list[2:5:3]
[2]
>>> my_list[slice(2, 5, 3)]
[2]
# To reverse list
#     with empty `start` and `end`, and `step` as `-1`
>>> my_list[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> my_list[slice(None, None, -1)]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

最新更新