##
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` に置き換え られます。