クラス内で関数(メソッド)にlistを投げると怪しきことに?

7月 13th, 2017

なんというか・・・、これは、pythonのバージョンによって挙動が変わる可能性がある。私のは3.4なので、それ以前だと多分発生するけど、以降だとちょっと分からない。

何のことを言っているか、意味不明なので、プログラムに語ってもらいやしょう。

#coding:UTF-8

class Test:
    def moto(self):
        a=10
        self.add(a)
        print ('a=',a)

    def add(self,num):
        num+=10
        print ('num=',num)

class LTest:
    def moto(self):
        alist=['林檎','みかん']
        self.ladd(alist)
        print ('alist=',alist)

    def ladd(self,data):
        st='すいか'
        data.append(st)
        print ('data=',data)

t=Test()
t.moto()
t2=LTest()
t2.moto()

初めのクラス「Test」は、数値の代入実験。aの値を同じクラス内の別の関数に送って別途計算。結果は
num=20
a=10
これはまあ、分かる。

問題はLTestクラスの方。予想では、
alist=['林檎','みかん']
data=['林檎','みかん','すいか']

となるかと思いきや、実際は、
alist=['林檎','みかん','すいか']
data=['林檎','みかん','すいか']

書き換えた覚えの無い「alist」まで書き換わってる~。\(^O^)/。頼んでないぞーう。

ちなみに、dataとして受け取って、そのまま扱っているのが悪いかもしれない、と、下記のように一旦別の変数に投入してから操作しても無駄。

    def ladd(self,ldata):
        data=ldata
        st='すいか'
        data.append(st)
        print ('data=',data)

何故こうなるかは、薄々分かる気はするのだが、ちょっと自信がない。とりあえず、気をつけましょう、ということで~。

関連記事

  1. 同じclass内にあるメソッドを呼び出してみる
  2. 他のクラスからインスタンス変数って使えるんだね
  3. ファイルの読み込みをちょこっと実験
  4. classの中身は即実行されるらしい
  5. クラスの継承を試してみた
  6. リスト全ての要素の改行(’\n’)を削る
  7. オブジェクト指向と大格闘2(無理矢理使ってみる)
  8. pygameでmp3を再生

Comments are closed.