Posted at

Pythonでインスタンス変数が引き継がれて困る

More than 3 years have passed since last update.


は?

本当に「は?」っていう感じでいまさらなのですが...


検証コード

問題のコード

# -*- coding: utf-8 -*-

class Hoge():
def __init__(self, data=[]):
self.data = data

def add_data(self):
self.data.append(u"ʅ(´◔౪◔)ʃ")

if __name__ == "__main__":
hoge = Hoge()
hoge.add_data()
hoge2 = Hoge()

print hoge2.data[0]

実行すると、ʅ(´◔౪◔)ʃが表示されます。

???????

以下のようにするとhoge2にdataは引き継がれない

# -*- coding: utf-8 -*-

class Hoge():
def __init__(self):
self.data = []

def add_data(self):
self.data.append(u"ʅ(´◔౪◔)ʃ")

if __name__ == "__main__":
hoge = Hoge()
hoge.add_data()
hoge2 = Hoge()

print hoge2.data

さらに、リストではなく文字列を入れるようにするとコンストラクタに引数を入れても引き継がれなかった

# -*- coding: utf-8 -*-

class Hoge():
def __init__(self, data=''):
self.data = data

def add_data(self):
self.data = u"ʅ(´◔౪◔)ʃ"

if __name__ == "__main__":
hoge = Hoge()
hoge.add_data()
hoge2 = Hoge()

print hoge2.data

なぜだ...

コンストラクタの引数にデフォルト値を入れるとなぜかインスタンス変数を引き継ぐ?

原因はわからないけど、気をつけます。

原因を知っている方はコメントいただけると幸いです