LoginSignup
0
2

More than 5 years have passed since last update.

Pythonのpopとappendではまった話

Last updated at Posted at 2017-05-29

for文を回してFIFOみたいな配列を使いたい事がある。
Pythonにはキューっていう物が存在しているみたいだが、仕事柄、JavascriptとかMATLABとかObjective-CとかJavaとかを同時に扱っているので、どうしても同じ様なコードで書きたくなってしまう。

今回Pythonで見事にはまった。popとappendは悪くないと思うけど、たぶん同じようにpopとappendを使って実装してしまう人がいるかもしれないので、メモ。

今回やりたかったのは、[1,2,3,4,5,6,7,8,9,10]のように並んでいる配列から、1文字ずつずらした配列を取得して、以下のような行列を作る事。

無題2.png

そこで、今回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みたいな配列を作って、追加してやればいいやーな発想。

しかし、結果は無残にも以下。

無題.png

ん!?ちゃんと、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])
0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2