重複の可能性:
Python の「最小の驚き」: 変更可能な既定の引数
Python 2.7 では、次のコードがあるとします。
class Base(object):
# Variant 1
def __init__(self, records=[]):
self._records = records
# Variant 2
# def __init__(self, records=[]):
# self._records = []
# if records:
# self._records = records
def append(self, value):
self._records.append(value)
class ChildA(Base):
pass
class ChildB(Base):
pass
a = ChildA()
b = ChildB()
a.append(100)
b.append(200)
print a._records
print b._records
バリアント 1 を使用して基本クラスを初期化すると、self._records はクラス変数のように動作します。バリアント 1 を使用してコードを実行し、基本クラスを初期化すると、次の出力が得られます。
[100, 200]
[100, 200]
バリアント 2 を使用して基本クラスを初期化すると、self._records はインスタンス変数のように動作します (予想どおり)。バリアント 2 を使用してコードを実行し、基本クラスを初期化すると、次の出力が得られます。
[100]
[200]
これらの両方のバリアントの違いは何ですか? バリアント 1 とバリアント 2 の動作が異なるのはなぜですか? 助けてくれてどうもありがとう!