ホームページ  >  記事  >  バックエンド開発  >  「最小のサプライズ」と可変のデフォルト引数

「最小のサプライズ」と可変のデフォルト引数

WBOY
WBOY転載
2024-02-22 12:30:22934ブラウズ

「最小のサプライズ」と可変のデフォルト引数

質問内容

Python を長年使用している人なら誰でも、次の問題に悩まされる (または引き裂かれる) でしょう。 リーリー

Python の初心者は、引数なしで呼び出されたこの関数が常に 1 つの要素のみを含むリストを返すことを期待します:

[5]。結果は大きく異なり、非常に驚​​くべきものです (初心者にとって): リーリー

私のマネージャーの 1 人は、この機能を初めて知り、この言語で「劇的な設計上の欠陥」と呼びました。私は、この動作には根本的な説明があり、その内部を理解していなければ確かに非常に不可解で驚くべきことになるだろうと答えました。ただし、次の質問には (自分自身に) 答えることができません。関数実行時ではなく関数定義時にデフォルト パラメーターをバインドする理由は何ですか?経験豊富な動作が実際に役立つとは思えません (バグを発生させずに c で静的変数を実際に使用する人がいるでしょうか?)

######編集###:###

baczek は興味深い例を挙げました。あなたのコメントのほとんど、特にutaalのコメントと併せて、さらに詳しく説明します:

リーリー 私にとって、設計上の決定は、パラメーターのスコープをどこに配置するかに関連しているように思えます。関数内に配置するか、それとも関数「とともに」配置するかです。

関数内でバインドするということは、

x

が関数の呼び出し時に、定義ではなく、指定されたデフォルト値に効果的にバインドされることを意味します。これは重大な欠点をもたらします。

def

行は次のようになります。 (関数オブジェクトの) バインディングの一部の「混合」は定義時に行われ、一部 (デフォルト パラメーターの割り当て) は関数呼び出し時に行われます。

実際の動作はより一貫しています。行が実行されるとき、つまり関数定義時に、行のすべての内容が評価されます。 正解

実際、これは設計上の欠陥でも、内部的またはパフォーマンス上の理由によるものでもありません。これは、Python の関数が単なるコードの一部ではなく、第一級のオブジェクトであるという事実に由来しています。

このように考えると完全に理にかなっています: 関数はその定義に従って評価されるオブジェクトです; デフォルト パラメーターは一種の「メンバー データ」であるため、その状態は呼び出しごとに変化する可能性があります - まさにその通りです。他のオブジェクトと同じように。


とにかく、effbot (Fredrik Lundh) が

Python のデフォルト パラメーター値

でこの動作の理由を詳しく説明しています。 これは非常に明確であることがわかり、関数オブジェクトがどのように機能するかをよりよく理解するために読むことを強くお勧めします。

以上が「最小のサプライズ」と可変のデフォルト引数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。