ホームページ >バックエンド開発 >Python チュートリアル >変更可能なデフォルト引数を使用して Python 関数を後続呼び出しすると、予期しない結果が生じるのはなぜですか?

変更可能なデフォルト引数を使用して Python 関数を後続呼び出しすると、予期しない結果が生じるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-03 19:44:42604ブラウズ

Why Do Subsequent Calls to a Python Function with a Mutable Default Argument Produce Unexpected Results?

デフォルト引数バインディングの異常

Python のデフォルト引数は、実行ではなく関数定義でバインドされると、プログラマを混乱させる可能性があります。たとえば、次の関数について考えてみましょう。

def foo(a=[]):
    a.append(5)
    return a

最初の呼び出しでは、単一の要素 [5] を含むリストが返されます。ただし、後続の呼び出しではこの要素数が増加し、予期しないパターンが発生します:

>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]

この一見非論理的な動作は、ファーストクラス オブジェクトとしての Python 関数の基本的な概念に由来しています。関数を定義すると、Python は関数とそのデフォルト パラメーターを関数オブジェクトの「メンバー データ」として評価します。その結果、これらのパラメーターは、通常のクラス属性と同じように、関数呼び出し全体でその状態を保持します。

定義時のこのバインディングには明確な根拠があります。これにより、関数定義のすべての側面が事前に解決されることが保証されます。関数の実行時にバインディングが実行される場合、関数のシグネチャは「ハイブリッド」になり、バインディングの一部は定義時に発生し、一部は呼び出し時に発生します。この不一致により、潜在的なエラーや混乱が生じる可能性があります。

定義時にデフォルトの引数をバインドすることにより、Python は関数オブジェクトの整合性を不変エンティティとして維持します。この動作により、Python 関数とそれに関連付けられたデフォルト パラメーターを操作するための、一貫性のあるわかりやすいフレームワークが提供されます。

以上が変更可能なデフォルト引数を使用して Python 関数を後続呼び出しすると、予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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