ここに関数があります。私の意図は、キーワード引数のデフォルトを使用して、辞書が提供されていない場合に辞書を空の辞書にすることです。
>>> 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 が指していたディクショナリに設定されています。
何が起こっている?
literal {}
囲んでいるスコープの定義行にありますか?
この動作は、2.5、2.6、および 3.1 で見られます。