■リストを使うときの注意!
2つの独立したリストを=でつなぐとリストが独立しなくなる
リストdtが取り回しするリスト、リストdt_0が初期値を格納したリスト、として、
dt=dt_0
でdtを初期値化(dtにdt_0を代入)したつもりになるが、
実際はこの=で両者が同一(のオブジェクト)となり、以後、
dtの要素を変えるとdt_0の要素も同じく変わり、初期値を保てない。
結果、再びdt=dt_0としてもdtが初期値化されずに現在値を保ったままになる。
以下、例・・・
#0:空のリストdtと要素のあるリストdt_0をつくった。
dt=[]
dt_0=["a","b"]
print("#0","dt=",dt,"dt_0=",dt_0)
#0 dt= [] dt_0= ['a', 'b']
#0結果:リストdtは空、リストdt_0はつくった要素のまま。
#リストdt_0の要素から変数a、bをつくっておく。
a=dt_0[0]
b=dt_0[1]
print("#1:リストdtにリストdt_0の要素を追加した。")
dt.append(dt_0[0])
dt.append(dt_0[1])
print("#1","dt=",dt,"dt_0=",dt_0)
#1 dt= ['a', 'b'] dt_0= ['a', 'b']
#1結果:リストdtの要素とリストdt_0の要素は同じになる。
print("")
#2:リストdtの要素を入れ替えた。
dt[0]=b
dt[1]=a
print("#2","dt=",dt,"dt_0=",dt_0)
#2 dt= ['b', 'a'] dt_0= ['a', 'b']
#2結果:リストdtの要素とリストdt_0の要素は異なった。
#3:リストdt=リストdt_0とした。
dt=dt_0
print("#3","dt=",dt,"dt_0=",dt_0)
#3 dt= ['a', 'b'] dt_0= ['a', 'b']
#3結果:リストdtの要素はリストdt_0と同じになった。
#4:さらにリストdtの要素を入れ替えた。
dt[0]=b
dt[1]=a
print("#4","dt=",dt,"dt_0=",dt_0)
#4 dt= ['b', 'a'] dt_0= ['b', 'a']
#4結果:リストdtの要素を入替えたのに、リストdt_0の要素も入れ替わった。
#3の処理「dt=dt_0」の「=」は「同じオブジェクトにした」を意味する。
だから、#2まで独立していたリストが、#3以降は独立しなくなったということ。
下記出典の終盤に記述がある。
初期値化は対象リストの要素を直接に初期値に置き換えるのがベスト。
便利な方法は下記出典参照!
2次元以上の行列リストの初期値化以外は注意点は少ない。
今回の1次元リストの例ならば・・・
dt=["a","b"]
と、直接代入するのがよい。
同じ内容を初期値として入れる、たとえば””(空の文字列)を2つ入れるなら、
dt=[””]^2
でよいようだ。
リスト要素を置き換える前後の要素のタイプが異なっても問題ない。