##
2.3.6 配列型

組み込み型には 6 つの配列型があります: 文字列、ユニコード文字列、 リスト、タプル、バッファ、そして xrange オブジェクトです。

文字列リテラルは `'xyzzy'`、`"frobozz"` といったように、 単引用符または二重引用符の中に書かれます。 文字列リテラルについての詳細はは、 Python リファレンスマニュアル の第 2 章を読んで下さい。 Unicode 文字列はほとんど文字列と同じですが、`u'abc'` 、 `u"def"` といったように先頭に文字 "`u`" を付けて 指定します。 リストは `[a, b, c]` のように要素をコンマで区切り角括弧で 囲って生成します。タプルは `a, b, c` のようにコンマ演算子で 区切って生成します (角括弧の中には入れません)。 丸括弧で囲っても囲わなくてもかまいませんが、空のタプルは `()` のように丸括弧で囲わなければなりません。 要素が一つのタプルでは、例えば `(d,)` のように、要素の後ろに コンマをつけなければなりません。

バッファオブジェクトは Python の構文上では直接サポートされていませんが、 組み込み関数 `buffer()` で生成することができます。バッファオブジェクトは結合や反復をサポート していません。

xrange オブジェクトは、オブジェクトを生成するための特殊な構文がない 点でバッファに似ていて、関数 `xrange()`で生成します。 xrange オブジェクトはスライス、結合、反復をサポートせず、 `in` 、 `not in` 、`min()` または `max()` は効率的ではありません。

ほとんどの配列型は以下の演算操作をサポートします。"`in`" および "`not in`" は比較演算とおなじ優先度を持っています。 "`+`" および "`*`" は対応する数値演算とおなじ優先度です。 2.8

以下のテーブルは配列型の演算を優先度の低いものから順に挙げたものです (同じボックス内の演算は同じ優先度です)。テーブル内の s および t は同じ型の配列です; n、i および j は整数です:

演算 | 結果 | 注釈
--- | --- | ---
`x in s` | s のある要素 x と等しい場合 `1` 、そうでない場合 `0` | (1)
`x not in s` | s のある要素が x と等しい場合 `0` 、そうでない場合 `1` | (1)
`s + t` | s および t の結合 |
`s * n , n * s` | s の浅いコピー n 個からなる結合 | (2)
`s[i]` | s の 0 から数えて i 番目の要素 | (3)
`s[i:j]` | s の i 番目から j 番目までのスライス | (3), (4)
`s[i:j:k]` | s の i 番目から j 番目まで、k 毎のスライス | (3), (5)
`len(s)` | s の長さ |
`min(s)` | s の最小の要素 |
`max(s)` | s の最大の要素 |

注釈:

(1)
  s が文字列または Unicode 文字列の場合、 演算操作 `in` および `not in` は部分文字列の一致テスト と同じように動作します。バージョン 2.3 以前の Python では、 x は長さ 1 の文字列でした。Python 2.3 以降では、x はどの長さでもかまいません。

(2)
  n が `0` 以下の値の場合、`0` として 扱われます (これは s と同じ型の空の配列を表します)。 コピーは浅いコピーなので注意してください; 入れ子になったデータ 構造はコピーされません。これは Python に慣れていないプログラマを よく悩ませます。例えば以下のコードを考えます:

      >>> lists = [[]] * 3
      >>> lists
      [[], [], []]
      >>> lists[0].append(3)
      >>> lists
      [[3], [3], [3]]

  上のコードでは、 `lists` はリスト `[[]]` (空のリストを唯一の 要素として含んでいるリスト) の3つのコピーを要素とするリストです。 しかし、リスト内の要素に含まれているリストは各コピー間で共有されています。 以下のようにすると、異なるリストを要素とするリストを生成できます:

      >>> lists = [[] for i in range(3)]
      >>> lists[0].append(3)
      >>> lists[1].append(5)
      >>> lists[2].append(7)
      >>> lists
      [[3], [5], [7]]

(3)
  i または j が負の数の場合、インデクスは文字列の 末端からの相対インデクスになります: `len(s) + i` または `len(s) + j` が代入されます。 しかし `-0` は `0` のままなので注意してください。

(4)
  s の i から j へのスライスは `i <= k < j` となるようなインデクス k を持つ要素からなる配列として定義されます。i または j が `len(s)` よりも大きい場合、`len(s)` を使います。 i が省略された場合、`0` を使います。 j が省略された場合、`len(s)` を使います。 i が j 以上の場合、スライスは空の配列になります。

(5)
  s の i 番目から j 番目まで k 毎の スライスは、`0` `<=` n `<` `abs(i-j)` となるような、 インデクス`x = i + n*k` を持つ要素からなる配列として 定義されます。 i または j `len(s)` より大きい場合、`len(s)` を使います。i または j を省略した場合、``最後'' (k の符号に依存)を示す値を使います。k はゼロにできないので 注意してください。

... は対応する数値演算とおなじ優先度です。2.8
  パーザが被演算子の型を識別できるようにするために、このような優先度でなければならないのです。