Pythonでのデフォルトの引数mess


ケビンに会う.🙋‍♂️ ケビンはPythonを学んでいる.ある日、彼は次のように解決する問題を与えられた.

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] そして印刷した.
  • 第二にも期待通りに働いた.今回は引数としてリストは提供されませんので、デフォルトの空リストを使用して、それに追加します.
  • さて、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.



    読書ありがとう😊
    この記事を参考にした場合は、ご希望と共有してください!
    フィードバックは、コメントで歓迎です.

    閉じるこの動画はお気に入りから削除されています
  • 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 , および.