28

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

>>> 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 で見られます。

4

1 に答える 1

4
>>> 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})
>>> 
于 2011-04-19T07:27:36.143 に答える