2

重複の可能性:
Python の「最小の驚き」: 変更可能な既定の引数

クラスのinit () 関数への辞書引数が、以前のインスタンスで以前に設定した値にデフォルト設定されていることがわかりました。私はこの動作を本当に理解していません.リストや基本変数では発生しないようです. コード例:

class TestClass:
  def __init__(
    self,
    adir={},
    alist=[],
    avar=None
  ):
    print("input adir: " + str(adir)) #for test2, shows test1.mydir
    self.mydir = adir
    self.mylist = alist
    self.myvar = avar

test1 = TestClass()   
test1.mydir['a'] = 'A'
test1.mylist = ['foo'] 
test1.myvar = 5

test2 = TestClass()
print(test2.mydir) #has same value of test1!
print(test2.mylist)
print(test2.myvar)

出力は次のようになります: initializing test1 input adir: {} initializing test2 input adir: {'a': 'A'} {'a': 'A'} [] なし test2 への辞書引数 (adir) が取得されるのはなぜですかtest1.mydir に設定しますか? 特に、リストのような他の変更可能な型とは動作が異なるのはなぜですか?

ありがとうございました!

4

1 に答える 1

2

DSM が言うように、変更可能な既定の引数を変更しないでください。代わりにこれを行います:

class TestClass:

  def __init__(self, adir=None, alist=None, avar=None):
    if alist is None:
      alist = []
    if adir is None:
      adir = {}
于 2012-07-03T19:34:03.743 に答える