どうもフジワラです。
今日は、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に関係なく、クラス、関数を使うときは、コピー元、参照元を意識しないとだるいことになります。
