Pythonで2次元配列

このあいだエントリ書いてて今更気づいたんですが、pythonで2次元配列の初期化って、

a = [[0]*3]*3

とかだとだめなんですね。

同じオブジェクトのコピーになってしまうので、どこかに要素を設定すると、複数箇所に同じ値が設定されてしまう。

リスト内包表記を使って書く手もありますが、numpyを使うのが正しい形なんだろうか

つらつらとサンプルを書いてみた

# coding=utf-8
# pythonで2次元配列

# リストの初期化
a = [0]*3
# [0, 0, 0]

# 2次次元配列の初期化?
a = [[0]*3]*3
# [[0, 0, 0], [0, 0, 0], [0, 0, 0]]


# でも要素を設定すると、おかしくなる(複数箇所に設定されてしまう)
a[0][0] = 1
# [[1, 0, 0], [1, 0, 0], [1, 0, 0]]

# リスト内包表記を使って2次元配列を作る
a = [[0 for j in range(3)] for i in range(3)]
# [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

# 要素を設定してもおかしくならない
a[0][0] = 1
# [[1, 0, 0], [0, 0, 0], [0, 0, 0]]

# numpyを使う
from numpy import *
a = zeros((3, 3))
#[[ 0.  0.  0.]
# [ 0.  0.  0.]
# [ 0.  0.  0.]]

a[0][0] = 1
#[[ 1.  0.  0.]
# [ 0.  0.  0.]
# [ 0.  0.  0.]]