Pythonでは配列は参照渡しで代入される。
例えば以下のような出力を出したいとします。
["Test_ID_1 ", "test","test"] ["Test_ID_ 2", "test","test"] ["Test_ID_ 3", "test","test"]
そこで以下のようなコードをpythonで書くとします。
row_ori=["test","test"] num = 0 count = 3 while num < count: row=row_ori strs = "Test_ID_" + str(num) row.insert(0,strs) num = num + 1 print(row)
しかし実際に出力されるのは
["Test_ID_ 1","test","test"] ["Test_ID_ 2","Test_ID_ 1", "test","test"] ["Test_ID_ 3","Test_ID_ 2", "Test_ID_ 1","test","test"]
これはどういうことでしょうか?
row=row_oriの記述で初期化を行なっているはずなのに….
実はpythoではリストは値渡しではなく参照渡しで行われます。つまり
row=row_ori
ではrow_oriのポインタがrowに渡されただけなのでrowに配列要素が挿入されると同じ参照を見に行っているrow_oriにも要素が挿入されたとみなされるのです。
copyモジュールを使おう
では、どうすれば解決できるのか?答えはcopyモジュールを使うことです。
以下のように書き換えることで求めていた出力を得ることができます。
import copy row_ori=["test","test"] num = 0 count = 10 while num < count: row=copy.copy(row_ori) strs = "Test_ID_" + str(num) row.insert(0,strs) num = num + 1