こんばんは。
今回は私がpythonを書くときによくやらかすことを紹介します。
私のように根本を理解していないとよく引っかかる間違いだと思います。
C言語だと配列を作成する際、変数を宣言→メモリの割り当て→初期化の順に行いますが、
pythonでこれに相当するものとしてリストがあります。
C言語の配列と異なる点として、メモリの割り当て操作が必要無いことや、長さが可変長であることが挙げられます。
しかしながら、pythonではC言語でいうポインタの操作が必要無いため、ポインタを扱っているのか
リストそのものを扱っているのか、を意識していないとよく勘違いをしてしまいます。
例1
>>> a = [1,2,3]
>>> b = a
>>>
>>> b[0] = 100
>>> a
[100, 2, 3]
>>> b
[100, 2, 3]
aに入っているリストをbにコピーしてbの中身を変更しました。
ただ、このままだとaとbは同じリストを参照することになるので変更がaに影響します。
これは次のようにcopyを用いると解消します。
>>> import copy
>>> a = [1,2,3]
>>> b = copy.copy(a)
>>> b[0] = 100
>>> a
[1, 2, 3]
>>> b
[100, 2, 3]
あるいは単純に、
>>> a = [1,2,3]
>>> b = list(a)
>>> b[0] = 100
>>> a
[1, 2, 3]
>>> b
[100, 2, 3]
とすることもできます。
例2
>>> a = [[0]*3]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][1] = 100
>>> a
[[0, 100, 0], [0, 100, 0], [0, 100, 0]]
3x3のリストを0で初期化してaに代入します。
しかし、これも先ほどと同じ理由で間違いです。
このままではa[0],a[1],a[2]のそれぞれが同一のリストを参照してしまいます。
そのため、このようにa[0][1]を変更するとa[1][1],a[2][1]も変わってしまいます。
これを解消するためには上のように省略せずに、書くといいでしょう。
>>> a = [[0]*3 for i in range(3)]
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][1] = 100
>>> a
[[0, 100, 0], [0, 0, 0], [0, 0, 0]]
以上私がよくやらかす間違いでした。皆さんは間違えないように気をつけて下さい。
Cではポインタを使うので間違えないんですけどね...(言い訳)
もっとpythonを勉強したいと思います。