重複の可能性:
Pythonの「驚き最小の原則」:可変のデフォルト引数
Python 2.7を使用していると、奇妙な動作に遭遇しました。それを説明する方法や、Pythonドキュメントに存在するかどうかさえわかりません。コードを使用する
class MyClass:
@staticmethod
def func(objects=[], a=None, b=None):
objects.append(a)
print 'objects: %s'%objects
print 'b: %s'%b
MyClass.func(a='one')
MyClass.func(a='two', b='foo')
MyClass.func(a='three')
get出力を取得します
objects: ['one']
b: None
objects: ['one', 'two']
b: foo
objects: ['one', 'two', 'three']
b: None
ご覧のとおり、メソッドの最初のリストパラメータ(オブジェクト)は、呼び出し間でその値を保持します。ヘッダー宣言にデフォルト値[]がある場合でも、最後のリストに新しい値が追加されます。ただし、最後のパラメーター(b)はその値を保持せず、呼び出しの間にデフォルト値にリセットされます。
(とにかく私にとって)期待されるのは、メソッドの呼び出しでobjectsパラメーターをデフォルトにリセットする必要があることです(bパラメーターのように)が、これは発生しないようで、最初の呼び出しでのみ発生するようです。
誰かがこの行動を説明できますか?これはこのバージョンのPythonのバグですか、それとも意図された動作ですか?おそらく、リスト参照が呼び出し間で保持されていることと関係がありますが、文字列変数(b)はそうではありませんか?私はこの振る舞いに非常に混乱しています。
ありがとう