関数パラメーターのデフォルト値として式を使用する
Pythonでは、関数のパラメーターのデフォルト値を設定して、パラメーターをオプションのパラメーターにすることができます。これは言語の優れた機能ですが、デフォルト値が変更可能である場合は少し面倒です。たとえば、次のPython関数定義について考えてみます。
def foo(bar=[]):
# barはオプションのパラメータです。指定されていない場合、デフォルト値は[]... bar.append("baz")
# しかし、この行には問題があります。見てください...
... return bar
よくある間違いは、この関数が呼び出されるたびに、このオプションのパラメーターに値を割り当てないと、常にこのデフォルトの式の値が割り当てられるということです。たとえば、上記のコードでは、プログラマーは、関数foo()を繰り返し呼び出すと(パラメーターバーをこの関数に渡さずに)、foo()が呼び出されるたびに、この関数は常に「baz」を返すと考える場合があります。 (barが渡されない)場合、パラメーターbarは[](つまり、空のリスト)に設定されます。
それでは、これを行うとどうなるか見てみましょう。
foo()["baz"]foo()["baz","baz"]foo()["baz","baz","baz"]
OK?この関数が、foo()が呼び出されるたびに新しいリストを作成するのではなく、常にデフォルト値「baz」を既存のリストに追加するのはなぜですか?
答えは、関数が定義されたときに1回だけ割り当てられる関数パラメーターのデフォルト値です。このように、関数foo()が初めて定義された場合にのみ、パラメーターバーのデフォルト値がデフォルト値(つまり、空のリスト)に初期化されます。 foo()が(パラメーターバーなしで)呼び出されると、バーの最初の初期化からのリストが引き続き使用されます。
したがって、次の解決策があります。
def foo(bar=None):...if bar is None:
# または、バーでない場合は使用します:... bar =[]... bar.append("baz")...return bar
... foo()["baz"]foo()["baz"]foo()["baz"]
コンテンツの補足:
これまでのところ、Python Xiaobaiに関するこの記事では、式を無差別に使用しないでください。関連するPython式については、ZaLou.Cnを検索してください。