コメントにてご指摘いただきました。
筆者の勘違いから理解までの流れをお楽しみください。
事象
listをクラス変数として初期化していると、
インスタンスのsample_1
とsample_2
でlist
が共有されちゃいます。
Sampleクラス
class Sample:
int_x:int = 0
list_y:list = []
def set_int(self, val):
self.int_x = val
def list_add(self, val):
self.list_y.append(val)
インスタンス生成後、当然両方とも初期値です。
インスタンス生成後
sample_1 = Sample()
sample_2 = Sample()
# 1_int:0
# 1_list:[]
# 2_int:0
# 2_list:[]
sample_1
のint
を変更してもsample_2
のint
には影響ないですね。
intを変更
sample_1.set_int(3)
# 1_int:3
# 1_list:[]
# 2_int:0
# 2_list:[]
ただしsample_1
のlist
を変更するとsample_2
のlist
も変更されています!
クラス変数でもlistはシャロ―コピーされるっぽいですね、、、
全然違いました。
こちらの素晴らしくわかりやすいコメントをご参照ください。
listを変更
sample_1.list_add('TEST')
# 1_int:3
# 1_list:['TEST']
# 2_int:0
# 2_list:['TEST']
解決方法
タイトル通りsampleクラスをこんな感じで変更して、
コンストラクタ内でlistを初期化すると想定通りの動きになります。
修正後Sampleクラス
class Sample:
int_x:int = 0
list_y:list
def __init__(self):
self.list_y = []
def set_int(self, val):
self.int_x = val
def list_add(self, val):
self.list_y.append(val)
インスタンス生成後、int
は前回と同じ動きになります。
インスタンス生成後
sample_1 = Sample()
sample_2 = Sample()
# 1_int:0
# 1_list:[]
# 2_int:0
# 2_list:[]
sample_1.set_int(3)
# 1_int:3
# 1_list:[]
# 2_int:0
# 2_list:[]
Sampleクラス
を修正したことで、想定通りsample_2
のlist
は影響なく済みました!
listを変更
sample_1.list_add('TEST')
# 1_int:3
# 1_list:['TEST']
# 2_int:0
# 2_list:[]
Python結構長いこと使っていましたが全然知りませんでした、、、
みんな気を付けてくれよな!