[[0]*m]*nの注意点、その2

  • ドキュメントを読む

前回の括弧の件ですが、pythonのドキュメントを読んだところ、次のような記述がありました。
4. 組み込み型 — Python 3.3.3 ドキュメント

ノート:

0 より小さい n の値は 0 として扱われます (s と同じ型の空シーケンスを与えます)。また、コピーは浅いコピーです; ネストされた構造はコピーされません。これは新人 Python プログラマーによく出没します; 次のコードを考えてください:

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

ここで、[] が空リストを含む 1 要素のリストなので、[] * 3 の 3 要素はこの一つの空リスト (へのポインタ) です。lists のいずれかの要素を変更すると、その一つのリストが変更されます。別々のリストのリストを作るにはこうします:

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

なんか、新人()がやってしまう「あるある」な例として挙げられてました。うへぇ
それはともかく、このリストのリスト構造は、よく使う方法なのか、単に説明のために用意されたものなのか。。