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