AboeBlog

[python]append(), extend()使用時の注意!

OpenClipart-Vectors / Pixabay

どうもフジワラです。

今日は、pythonでappend(),extend()を使うときの注意点を書いていきます。

 

スポンサーリンク

append(), extend()とは

まず、append()は、リストの末尾に要素を追加したい時に使います。

 


a=[1, 2]

a.append("追加したよ")

 

#a=[1, 2, "追加したよ"]

という風になります。

extend()は、リスト同士をくっつける奴です。


a=[1, 2, 3]

b=[4, 5, 6]

 

a.extend(b)

#a=[1, 2, 3, 4, 5, 6]

という風になります。

 

注意点

append(), extend()とかをクラス内や、関数内で使うときは注意が必要です。

 


class sample_caution():
def caution(self, arg):
arg.append("appended")

arg=[1, 2, 3]

sample_caution=sample_caution()

print(arg) #arg=[1, 2, 3]

sample_caution.caution(arg)

print(arg) #arg=[1, 2, 3, "appended"]

という風に、引数に取った元のリストに対して変更を加えてしまいます。

(extendも同様)

 

なぜこうなるかというと、C言語とかをやっていた方だとたぶんわかると思います。

(いわゆる、シャローコピー、ディープコピーというやつです。)

これを防ぐには、copyモジュールでdeepcopyをしてやれば解決です。

import copy

class sample_caution():
   def caution(self, arg):
      arg=copy.deepcopy(arg)
      arg.append("appended")



arg=[1, 2, 3]

sample_caution=sample_caution()

print(arg) #arg=[1, 2, 3]

sample_caution.caution(arg)

print(arg) #arg=[1, 2, 3]

 

という感じでできます。

まとめ

まあ、append、extendに関係なく、クラス、関数を使うときは、コピー元、参照元を意識しないとだるいことになります。