Pythonには特殊な記号「*」があり、数値演算の乗算演算子やオブジェクトの繰り返し演算子として使用できます。ただし、繰り返し演算子として使用する場合は注意が必要です
: ※繰り返される各オブジェクトは同じIDを持ち、メモリ内の同じアドレスを指していることになります。各オブジェクトを操作する際には注意が必要です。
例:
>>> alist = [range(3)]*4 >>> alist [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
上記は行列をシミュレートするために 2 レベルのリストを初期化します。説明の便宜上、行列はここでは A として表されます。
ここで、次のコードを使用して、A11 に 1 の値を代入したいと思います:
1
alist[0][0]=1
そして、必要な結果は次のようになります。 :
1
[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
でも残念ながら、得られる結果は次のとおりです:
1
[[1, 1, 2], [1, 1, 2], [1, 1, 2], [1, 1, 2]]
何が起こっているのでしょうか? なぜ A21 に値が割り当てられ、それに応じて他の Ai1 も変更されるのでしょうか?
>>> id(alist[0]) 18858192 >>> id(alist[1]) 18858192 >>> id(alist[2]) 18858192 >>> id(alist[3]) 18858192 >>>ほら、ID はすべて同じです。これは、これら 4 つのリストが同じであることを意味します。 この場合、行列をシミュレートしたい場合はどうすればよいでしょうか? もちろん、特別な numpy パッケージに加えて、新しいリストを 1 つずつ上のリストに追加することもできます。例えば:
>>> blist=[] >>> for i in range(4): blist.append([j for j in range(3)]) >>> blist [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
このようにして、上記の代入操作を試すことができます:
>>> blist[0][0]=1 >>> blist [[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]] >>>