2つの関数が同じことを実行することを期待する必要がある理由はありません。ましてや、同じパフォーマンス特性を持っていることは言うまでもありません。
def test_function(A = value()):
#rest of function....
この関数には「キーワード引数」がありません。そのようなことはありません。デフォルト値の引数があります。任意の関数の任意のパラメーター(一部の扱いにくい組み込み関数は別として)は、キーワードまたは位置で渡すことができますが、引数は本質的に「キーワード引数」ではありません。
キーワード引数とデフォルト値の唯一の関連は、デフォルト値を持つ複数の引数がある場合、前の引数のデフォルトを受け入れながら後の引数に明示的な値を提供する唯一の方法は、後の引数をキーワードで渡すことです。
2つの関数の大きな違いは、のデフォルト値を宣言するとA
、それがデフォルト値であり、明示的な値が指定されていない場合に毎回値を再生成するコードではないことです。あなたがこれを言うとき:
def test_function(A = value()):
#rest of function....
のデフォルト値を設定していますA
。他のコンテキストと同様に、Pythonが値を必要とする複雑な式を提供すると、Pythonはその式を評価し、結果の値を使用します。A
したがって、関数定義時にデフォルト値を設定するvalue()
と、その時点で返されるものに設定されます。その場合、その1つの値がのデフォルト値になりますA
。
def test_function():
A = value()
#rest of function ...
この関数でvalue()
は、関数が呼び出されるたびに評価されます。したがって、value()
高価な場合、このバージョンは最初のバージョンよりもはるかに時間がかかります。ただし、value()
後で変更するオブジェクトを返す場合、デフォルト引数バージョンは、関数が呼び出されたときの状態に関係なく、常に1つのオブジェクトを使用しますが、2番目のバージョンはvalue
毎回新しいオブジェクトを作成します。 。使用するバージョンは、プログラムに持たせたいセマンティクスによって決定する必要があります。