web-dev-qa-db-ja.com

python関数のキーワード引数のデフォルト値としての空の辞書:辞書は後続の呼び出しで{}に初期化されていないようですか?

これが関数です。私の意図は、キーワード引数のデフォルトを使用して、辞書が提供されていない場合に辞書を空の辞書にすることです。

>>> def f( i, d={}, x=3 ) :
...     d[i] = i*i
...     x += i
...     return x, d
... 
>>> f( 2 )
(5, {2: 4})

しかし、次にfを呼び出すと、次のようになります。

>>> f(3)
(6, {2: 4, 3: 9})

2番目の呼び出しのキーワード引数dは、空の辞書を指しているのではなく、前の呼び出しの最後に残された辞書を指しているように見えます。番号xは、呼び出しごとに3にリセットされます。

これで回避できますが、ご理解のほどよろしくお願いいたします。キーワード引数は関数のローカルスコープ内にあり、関数が返されると削除されると思いました。 (私が不正確である場合は、私の用語を言い訳して修正してください。)

したがって、名前dが指すローカル値を削除し、次の呼び出しでキーワード引数dを指定しない場合は、dをdefault {}に設定する必要があります。しかし、ご覧のとおり、dは前の呼び出しでdが指し示した辞書に設定されています。

何が起こっている?

囲んでいるスコープのdef行にliteral {}がありますか?

この動作は、2.5、2.6、および3.1で見られます。

26
Andrej Panjkov
>>> def f(i, d=None, x=3):
...     if not d:
...         d={}
...     d[i] = i*i
...     x += i
...     return x,d
... 
>>> f(2)
(5, {2: 4})
>>> f(3)
(6, {3: 9})
>>> 
2
DTing