PythonXiaobaiは式を無差別に使用するべきではありません

関数パラメーターのデフォルト値として式を使用する

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を検索してください。

Recommended Posts

PythonXiaobaiは式を無差別に使用するべきではありません
Pythonクローラー-美しいスープの使用
Python3外部モジュールの使用