「最も驚くべきこと」と可変のデフォルト引数
可変のデフォルト引数を使用した Python の驚くべき動作は、数え切れないほどの開発者を困惑させてきました。次の点を考慮してください。
def foo(a=[]): a.append(5) return a
直感的には、この関数はパラメーターなしで呼び出された場合、常に [5] のみを含むリストを返すと予想されるかもしれません。しかし、この仮定は実際の出力によって打ち砕かれます:
>>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5]
それで、何が起こっているのでしょうか?
鍵は Python のファーストクラス関数オブジェクトにあります。関数が定義されると、デフォルト引数の評価も含めて、ただちに評価されます。 foo の場合、a のデフォルト値は空のリストとして評価されます。ただし、このリストは関数オブジェクト自体内に格納されるため、後続の呼び出しに対して変更可能になります。
C などの言語とは異なり、Python の関数パラメーターはコンパイル時に評価される静的変数ではありません。代わりに、時間の経過とともに変化する可能性のあるオブジェクトにバインドされます。関数オブジェクトの「メンバー データ」という概念は、変更可能なデフォルト引数で観察される驚くべき動作を説明しています。
effbot が Python のデフォルト パラメータ値で述べているように、この動作は論理的であり、他のオブジェクトの動作方法と一貫しています。 :
"すべてのオブジェクトは、ある呼び出しから別の呼び出しにその状態が変更される可能性があります。なぜ関数は
したがって、この動作は最初は驚くかもしれませんが、最終的には Python のオブジェクト指向の性質と可変オブジェクトの動作の期待に合わせて「最小の驚き」の原則に従っています。
以上がPython の可変デフォルト引数の動作はなぜそれほど驚くべきのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。