6.3.3. 切片

切片就是在序列对象(字符串、元组或列表)中选择某个范围内的项。 切片可被用作表达式以及赋值或 del 语句的目标。 切片的句法如下:

  1. slicing ::= primary "[" slice_list "]"
  2. slice_list ::= slice_item ("," slice_item)* [","]
  3. slice_item ::= expression | proper_slice
  4. proper_slice ::= [lower_bound] ":" [upper_bound] [ ":" [stride] ]
  5. lower_bound ::= expression
  6. upper_bound ::= expression
  7. stride ::= expression

此处的正式句法中存在一点歧义:任何形似表达式列表的东西同样也会形似切片列表,因此任何抽取操作也可以被解析为切片。 为了不使句法更加复杂,于是通过定义将此情况解析为抽取优先于解析为切片来消除这种歧义(切片列表未包含正确的切片就属于此情况)。

切片的语义如下所述。 元型通过一个根据下面的切片列表来构造的键进行索引(与普通抽取一样使用 __getitem__() 方法)。 如果切片列表包含至少一个逗号,则键将是一个包含切片项转换的元组;否则的话,键将是单个切片项的转换。 切片项如为一个表达式,则其转换就是该表达式。 一个正确切片的转换就是一个切片对象(参见 标准类型层级结构 一节),该对象的 start, stopstep 属性将分别为表达式所给出的下界、上界和步长值,省略的表达式将用 None 来替换。