##
5.3.3 スライス表記 (slicing)

スライス表記は配列オブジェクト (文字列、タプルまたはリスト) におけるある 範囲の要素を選択します。スライス表記は式として用いたり、代入や del 文の 対象として用いたりできます。スライス表記の構文は以下のようになります:

  `slicing` | ::= | `simple_slicing | extended_slicing`
  `simple_slicing` | ::= | `primary "[" short_slice "]"`
  `extended_slicing` | ::= | `primary "[" slice_list "]"`
  `slice_list` | ::= | `slice_item ("," slice_item)* [","]`
  `slice_item` | ::= | `expression | proper_slice | ellipsis`
  `proper_slice` | ::= | `short_slice | long_slice`
  `short_slice` | ::= | `[lower_bound] ":" [upper_bound]`
  `long_slice` | ::= | `short_slice ":" [stride]`
  `lower_bound` | ::= | `expression`
  `upper_bound` | ::= | `expression`
  `stride` | ::= | `expression`
  `ellipsis` | ::= | `"..."`

  Download entire grammar as text.

上記の形式的な構文法にはあいまいさがあります: 式リストに見えるものは、 スライスリストにも見えるため、添字表記はスライス表記としても解釈されうる ということです。 この場合には、(スライスリストの評価結果が、適切なスライスや省略表記 (ellipsis) にならない場合)、スライス表記としての解釈よりも添字表記 としての解釈の方が高い優先順位を持つように定義することで、構文法をより 難解にすることなくあいまいさを取り除いています。同様に、 スライスリストが厳密に一つだけの短いスライスで、末尾にカンマが 続いていない場合、拡張スライスとしての解釈より、単純なスライスとして の解釈が優先されます。

単純なスライスに対する意味付けは以下のようになります。 一次語の値評価結果は、配列型のオブジェクトでなければなりません。 下境界および上境界を表す式がある場合、それらの値評価結果は整数で なくてはなりません; デフォルトの値は、それぞれゼロと `sys.maxint` です。どちらかの境界値が負である場合、 配列の長さが加算されます。こうして、スライスは i および j をそれぞれ指定した下境界、上境界として、 インデクス k が `i <= k < j` となる全ての 要素を選択します。 選択の結果、空の配列になることもあります。i や j が 有効なインデクス範囲の外側にある場合でも、エラーにはなりません (範囲外の要素は存在しないので、選択されないだけです)。

拡張スライスに対する意味付けは、以下のようになります。 一次語の値評価結果は、辞書型のオブジェクトでなければなりません。 また、辞書は以下に述べるようにしてスライスリストから生成された キーによってインデクス指定できなければなりません。 スライスリストに少なくとも一つのカンマが含まれている場合、 キーは各スライス要素を値変換したものからなるタプルになります; それ以外の場合、単一のスライス要素自体を値変換したものがキーになります。 一個の式でできたスライス要素の変換は、その式になります。 省略表記スライス要素の変換は、組み込みの `Ellipsis` オブジェクト になります。適切なスライスの変換は、スライスオブジェクト (3.2 参照) で、`start`, `stop` および `step` 属性は、それぞれ指定した下境界、上境界、および とび幅 (stride) になります。式がない場合には、`None` に置き換え られます。