ホームページ > バックエンド開発 > Python チュートリアル > Python の可変デフォルト引数の動作はなぜそれほど驚くべきのでしょうか?

Python の可変デフォルト引数の動作はなぜそれほど驚くべきのでしょうか?

Susan Sarandon
リリース: 2024-12-24 08:46:20
オリジナル
888 人が閲覧しました

Why Does Python's Mutable Default Argument Behavior Seem So Surprising?

「最も驚くべきこと」と可変のデフォルト引数

可変のデフォルト引数を使用した 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート