これが関数です。私の意図は、キーワード引数のデフォルトを使用して、辞書が提供されていない場合に辞書を空の辞書にすることです。
>>> 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で見られます。
>>> 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})
>>>