ホームページ >バックエンド開発 >Python チュートリアル >Python の変更可能なデフォルト引数が予期しない動作を引き起こすのはなぜですか?

Python の変更可能なデフォルト引数が予期しない動作を引き起こすのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-22 21:54:13274ブラウズ

Why Do Mutable Default Arguments in Python Lead to Unexpected Behavior?

「最小の驚き」と変更可能なデフォルト引数

Python の foo 関数の予期しない動作 (デフォルト引数が実行ではなく関数定義でバインドされる)多くの人を当惑させた。これはプログラミングの失敗だと考える人もいます。ただし、この動作には、第一級の関数を備えた言語としての Python の性質に根ざした健全な理論的根拠があります。

Python の関数は単なるコードのブロックではありません。これらは、定義時に評価されるオブジェクトです。この評価には、関数オブジェクトの「メンバー データ」として機能するバインドされたデフォルト引数が含まれます。その結果、オブジェクトの状態変更が保持されるのと同様に、デフォルト引数に加えられた変更は関数呼び出し全体で保持されます。

説明のために、メッセージを出力し、空のリストを返す関数 a について考えてみましょう。別の関数 b は、デフォルト値 a() を持つ単一のパラメーター x を受け取ります。 x を指定せずに b を呼び出すと、x が a の呼び出し結果にバインドされ、空のリストが返されます。ただし、空のリストは b 内のデフォルト引数として格納されるため、後続の b の呼び出しではこの同じリストが追加され、最初の呼び出しでは [5] が出力され、2 回目の呼び出しでは [5, 5] が出力されるという観察された動作が発生します。 .

この動作は、プログラムの動作がプログラマーが合理的に期待するものと一致する必要があるという「最小の驚き」の原則に従います。この場合、関数オブジェクトが定義されると、そのデフォルトの引数はその状態の一部となり、それらの引数への変更は後続の呼び出しに反映されます。

この動作は一部の人にとって直観に反しているように見えるかもしれませんが、一貫しています。 Python の設計哲学を取り入れています。関数をファーストクラスのオブジェクトとして使用すると、柔軟性が高まり、よりオブジェクト指向のスタイルのプログラミングが促進されます。この概念を理解すると、プログラマーは Python の基礎をより深く理解し、より堅牢で効果的なコード開発を促進できます。

以上がPython の変更可能なデフォルト引数が予期しない動作を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。