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