幻魔ナイトブログ

主に絵、音楽、プログラミングなどについて書きます。

Pythonの配列での注意事項、値渡しと参照渡し

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

お問合わせはこちら