###
2.3.6.4 変更可能な配列型

リストオブジェクトはオブジェクト自体の変更を可能にする追加の操作を サポートします。他の変更可能な配列型 (を言語に追加する場合) も、 それらの操作をサポートしなければなりません。 文字列およびタプルは変更不可能な配列型です: これらのオブジェクトは 一度生成されたらそのオブジェクト自体を変更することができません。 以下の操作は変更可能な配列型で定義されています (ここで x は 任意のオブジェクトとします):

操作 | 結果 | 注釈
--- | --- | ---
`s[i] = x` | s の要素 s を x と入れ替えます |
`s[i:j] = t` | s の i から j 番目までの要素を t と入れ替えます |
`del s[i:j]` | `s[i:j] = []` と同じです |
`s[i:j:k] = t` | `s[i:j:k]` の要素を t と入れ替えます | (1)
`del s[i:j:k]` | リストから `s[i:j:k]` の要素を削除します |
`s.append(x)` | `s[len(s):len(s)] = [x]` と同じです | (2)
`s.extend(x)` | `s[len(s):len(s)] = x` と同じです | (3)
`s.count(x)` | `s[i] == x` となる i の個数を返します |
`s.index(x[, i[, j]])` | `s[k] == x` かつ `i <= k < j` となる最小の k を返します。 | (4)
`s.insert(i, x)` | `i >= 0` の場合の `s[i:i] = [x]` と同じです | (5)
`s.pop([i])` | `x = s[i]; del s[i]; return x` と同じです | (6)
`s.remove(x)` | `del s[s.index(x)]` と同じです | (4)
`s.reverse()` | s の値の並びを反転します | (7)
`s.sort([cmpfunc=None])` | s の要素を並べ替えます | (7), (8), (9), (10)

Notes:

(1)
  t は入れ替えるスライスと同じ長さでなければいけません。

(2)
  かつての Python の C 実装では、複数パラメタを受理し、 非明示的にそれらをタプルに結合していました。この間違った機能は Python 1.4 で廃用され、Python 2.0 の導入とともにエラーにする ようになりました。

(3)
  x がリストオブジェクトでない場合、例外を送出します。 `extend()` は実験的なメソッドであり、リスト以外の変更可能な 配列型ではサポートされていません。

(4)
  x が s 中に見つからなかった場合 `ValueError` を送出します。　 負のインデクスが二番目または三番目のパラメタとして `index()` メソッドに渡されると、これらの値にはスライスのインデクスと同様に リストの長さが加算されます。加算後もまだ負の場合、その値はスライス のインデクスと同様にゼロに切り詰められます。 バージョン2.3 以降で変更された 仕様: 以前は、`index()` は開始位置や終了位置を 指定するのに負の数を使うことができませんでした

(5)
  `insert()` の最初のパラメタとして負のインデクスが渡された場合、スライスのインデクスと同じく、リストの長さが加算されます。それでも負の値を取る場合、スライスのインデクスと同じく、0 に丸められます。 バージョン2.3 以降で変更された 仕様: 以前は、すべての負値は 0 に丸められていました。
(5)
  配列の先頭に新しい要素が追加されます。

(6)
  `pop()` メソッドはリストおよびアレイ型のみでサポート されています。オプションの引数 i は標準で `-1` なので、 標準では最後の要素をリストから除去して返します。

(7)
  `sort()` および `reverse()` メソッドは 大きなリストを並べ替えたり反転したりする際、容量の節約のために リストを直接変更します。副作用があることをユーザに思い出させるために、 これらの操作は並べ替えまたは反転されたリストを返しません。

(8)
  `sort()` メソッドはオプションの引数として比較関数 をとります。この比較関数は二つの引数 (list items) をとり、最初の引数 が二つ目の引数と比べてより小さいか、等しいか、より大きいかによって、 それぞれ負、ゼロ、正の値を返します。この指定は並べ替え 処理をかなり低速化するので注意してください;

  たとえば、リストを逆順に並べ替えるためにには、要素を反転して順序づけする ような比較関数で `sort()` を使うより、`sort()` の後に `reverse()` を呼ぶほうがはるかに高速です。比較関数として `None` を渡すことは、比較関数なしで `sort()` を呼ぶのと 同じ意味です。 バージョン2.3 以降で変更された 仕様: `None` を渡すのと、varcmpfunc を省略した場合とで、 同等に扱うサポートを追加

  `sort()` メソッドに cmpfunc 引数を使う例として、シーケンスのリストを、シーケンスの 2 つ目の要素でソートする場合を考えてみましょう。

      def mycmp(a, b):
          return cmp(a[1], b[1])

      mylist.sort(mycmp)

  それなりにサイズの大きいデータ構造に対しては、より時間効率のよりアプローチが、頻繁に使われます。

      tmplist = [(x[1], x) for x in mylist]
      tmplist.sort()
      mylist = [x for (key, x) in tmplist]

(9)
  `sort()` メソッドが安定しているかどうかは 言語上では定義されていません (比較結果が等しい要素の相対的な位置を 変えないことを保証しているとき、並べ替えが安定しているといいます)。 Python の C 実装では、Python 2.2 まで並べ替えはただ偶然に安定 していました。Python 2.3 の C 実装は安定な `sort()` メソッド を導入しましたが、異なる Python の実装間やバージョンの間での可搬性を 見込んだコードでは、この安定性に依存してはいけません。

(10)
  リストが並べ替えられている間は、リストの変更はもとより、 その値の閲覧すらその結果は未定義です。

  Python 2.3 の C 実装では、この間リストは空に見えるようになり、 並べ替え中にリストが変更されたことが検出されると `ValueError` が送出されます。