2

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

私はこの機能を作りました:

def test(num,v=[]):
    v.append(num)
    if num == 10:
        return v
    return test(num+1,v)

私がそれを使用すると、以前の呼び出しの結果がまだそこにあるようです:

>>> test(3)
[3, 4, 5, 6, 7, 8, 9, 10]
>>> test(3)
[3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 5, 6, 7, 8, 9, 10]
>>> test(3)
[3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 5, 6, 7, 8, 9, 10]

vではなく関数宣言だけで使用するv=[]と、うまくいくようです。
私は何が欠けていますか?実行するたびに関数を新鮮にしたい。Python 2.7.3 を使用しています。

4

1 に答える 1

2

オブジェクトをデフォルトの引数として使用すると、オブジェクトの同じインスタンスがその関数へのすべての呼び出しに使用されます。これは不変オブジェクトでは問題なく機能しますが、可変オブジェクトでは問題になります。関数がおそらく「新しい」オブジェクトを持つことを期待している場合、同じオブジェクトが複数回変更され、再利用されます。

次のような回避策を使用して、必要な機能を取得できます。

def test(num,v=None):
    if v is None:
        v = []
    ....
于 2012-11-18T03:03:31.243 に答える