Pythonでのデフォルトの引数mess
5425 ワード
ケビンに会う.🙋♂️ ケビンはPythonを学んでいる.ある日、彼は次のように解決する問題を与えられた.
ケビンはすぐに次の解決策を説明します.
最初の呼び出し 第二にも期待通りに働いた.今回は引数としてリストは提供されませんので、デフォルトの空リストを使用して、それに追加します. さて、3回目の呼び出しは予期せぬ結果になった. 我々がもう一度電話をしたとき
なぜこんなことが起こったのですか.
これが起こったのは、関数が最初に定義されたときにPythonがデフォルト引数を一度だけ定義しているからです.
これは、Pythonはパーサが遭遇したときに行ごとに解析されるためです
Pythonのこの動作は、デフォルト引数が変更可能な場合に特別な問題になります.
値の値として、immutablesを変更することはできません、関数内で引数変数を更新する場合は、新しいオブジェクトを作成し、元の既定のオブジェクトを変更する代わりにそのオブジェクトを指すように開始します.
しかし、変更可能なデフォルト引数の場合、関数の解析時に作成されたオブジェクトは、その関数呼び出しに対して別のオブジェクトを作成する代わりに更新されます.
解決策
この問題の解決法は変更可能なデフォルト引数をmutableの代わりに使うことです.好ましい選択は
でもどうして?中を見ましょう.
ソリューションはなぜ動作しますか?
この動画を見るには、次のコードが間違っていることがわかります.
ご覧の通り、この場合はオリジナルです
さて、コードの修正されたバージョンを参照してください.
ヒア
読書ありがとう😊
この記事を参考にした場合は、ご希望と共有してください!
フィードバックは、コメントで歓迎です.
閉じるこの動画はお気に入りから削除されています Modern C++ Features What Happens When You Run a Computer Program? Comprehensions in Python: Explained Linux Commands Reference With Examples この記事はもともと公開されたYuvraj's CS Blog .
接続してください.GitHub , および.
Design a function that appends '#' to a list provided as an argument and then prints it. If no argument is provided then the function should use an empty list as a default.
ケビンはすぐに次の解決策を説明します.
def append(l = []):
l.append('#')
print(l)
良いテスト、解決策をテストするための時間append([1, 2, 3])
# OUTPUT: [1, 2, 3, '#'] | OK
append()
# OUTPUT: ['#'] | OK
append()
# OUTPUT: ['#', '#'] | Strange!!
append
細工.それはリストに加えられた[1, 2, 3]
そして印刷した.append
引数がなければ、['#', '#']
の代わりに['#']
我々が上記の呼び出しにあったので.なぜこんなことが起こったのですか.
これが起こったのは、関数が最初に定義されたときにPythonがデフォルト引数を一度だけ定義しているからです.
これは、Pythonはパーサが遭遇したときに行ごとに解析されるためです
def
デフォルト引数を値に設定し、その値を将来の呼び出しで使用します.Pythonのこの動作は、デフォルト引数が変更可能な場合に特別な問題になります.
値の値として、immutablesを変更することはできません、関数内で引数変数を更新する場合は、新しいオブジェクトを作成し、元の既定のオブジェクトを変更する代わりにそのオブジェクトを指すように開始します.
しかし、変更可能なデフォルト引数の場合、関数の解析時に作成されたオブジェクトは、その関数呼び出しに対して別のオブジェクトを作成する代わりに更新されます.
解決策
この問題の解決法は変更可能なデフォルト引数をmutableの代わりに使うことです.好ましい選択は
None
(ただし、変更不可能な値を選ぶことはできますが).def append(l = None):
if l is None:
l = []
l.append('#')
print(l)
この解決策をテストしましょうappend([1, 2, 3])
# OUTPUT: [1, 2, 3, '#'] | OK
append()
# OUTPUT: ['#'] | OK
append()
# OUTPUT: ['#'] | Works fine!
すごい!この解決策は期待通りに働いた.でもどうして?中を見ましょう.
ソリューションはなぜ動作しますか?
この動画を見るには、次のコードが間違っていることがわかります.
ご覧の通り、この場合はオリジナルです
l
ではなく、l
関数呼び出しごとにlist
は変更可能な値です.さて、コードの修正されたバージョンを参照してください.
ヒア
None
したがって、変更できない値であり、各関数呼び出しに対して新しいリストオブジェクトが作成されます.Note: The default argument is a property of the function object therefore, initially it is the same for all function calls.
読書ありがとう😊
この記事を参考にした場合は、ご希望と共有してください!
フィードバックは、コメントで歓迎です.
閉じるこの動画はお気に入りから削除されています
接続してください.GitHub , および.
Reference
この問題について(Pythonでのデフォルトの引数mess), 我々は、より多くの情報をここで見つけました https://dev.to/yuvraajsj18/the-mutable-default-argument-mess-in-python-17baテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol