for文を回してFIFOみたいな配列を使いたい事がある。
Pythonにはキューっていう物が存在しているみたいだが、仕事柄、JavascriptとかMATLABとかObjective-CとかJavaとかを同時に扱っているので、どうしても同じ様なコードで書きたくなってしまう。
今回Pythonで見事にはまった。popとappendは悪くないと思うけど、たぶん同じようにpopとappendを使って実装してしまう人がいるかもしれないので、メモ。
今回やりたかったのは、[1,2,3,4,5,6,7,8,9,10]のように並んでいる配列から、1文字ずつずらした配列を取得して、以下のような行列を作る事。

そこで、今回Pythonで書いてしまい、見事にはまったコードがこれ。
(このコードだと簡略されており、このように書かなくても問題ないが、元コードはこう書く必要があった)
data_array=[1,2,3,4,5,6,7,8,9,10]
A=[]
R=[]
for i in range(10):
if(len(A)<5):
A.append(data_array[i])
else:
R.append(A)
A.pop(0)
A.append(data_array[i])
最初5文字は普通にappendして、それ以降はpopとappendで、FIFOみたいな配列を作って、追加してやればいいやーな発想。
しかし、結果は無残にも以下。

ん!?ちゃんと、popしているよね? appendしているよね?? 何々!?
って感じでテンパってしまったのだけど、まぁPythonで一番気を付けるべき、初歩的な間違いをやってしまってました。配列のメモリに気を付けないといけないんです。
詳細はこちらの方が詳しく紹介してくれています。
http://qiita.com/utgwkk/items/5ad2527f19150ae33322
んで、正しいコードはこちら。copy.deepcopy
で他のメモリに移さないといけないっぽい。
import copy
data_array=[1,2,3,4,5,6,7,8,9,10]
A=[]
R=[]
for i in range(10):
if(len(A)<5):
A.append(data_array[i])
else:
temp_data = copy.deepcopy(A)
R.append(temp_data)
A.pop(0)
A.append(data_array[i])