Pythonメモ--クローズ

4873 ワード

Pythonメモ–クローズ
1.定義Pythonのメソッドは使用時に1つのオブジェクトを戻り値(Noneを含む)として返しますが、Pythonでは万物すべてのオブジェクトの原則に基づいて戻り値を1つの関数の参照(すなわちC++の関数ポインタ)に変えると何が面白いのでしょうか.
def out_function():
    x = "  "
    def inner_function():
        print(x)
    return inner_function

if __name__ == "__main__":
    inner = out_function() #inner = inner_function
    inner()  #   x

上記のコードブロック(out_functionとinner_functionを含む)は、装飾器を思いついたのか、装飾器の使用が閉パッケージの一例である.
閉包:外層関数内に内層関数を定義し、内層関数は外層関数で宣言された変数を使用し、外層関数の戻り値は内層関数の参照であり、このとき、上記のコードは閉包を構成していると呼ぶ.
2.特徴
通常、1つの方法は呼び出しが終了すると、ゴミ回収メカニズムによって処理され、変数をクリアし、メモリを解放します.しかし、閉パッケージでは、外層メソッドの変数が内層メソッドによってアクセスされる場合、外層メソッドが回収されると、対応する変数(特に内層メソッドに必要な変数)が内層メソッドの変数にバインドされます.
上記の例では、innerに対応する内層メソッドは、外層メソッドの変数xを必要とするため、外層メソッドout_functionが呼び出された後、変数xは回収されず、inner_functionに暗黙的にバインドされる.バインドされていない場合、inner = out_function()が実行されると、変数xが解放され、inner()が実行されるとエラーが報告され、内層メソッドinner_functionには変数xはありません.
したがって、この暗黙的なバインドは、閉パケットが提供しなければならないサービスであり、閉パケットの大きな特色でもある.
3.変数の変更
内層メソッドは外層メソッドの変数を呼び出すことができると言っていますが、変数を変更してもいいですか.答えはいいですが、直接修正することはできません.変更不可変数は直接変更できません.変更時に変更可能変数に変換するか、キーワードnolocalを使用する必要があります.
def out_function():
    x = "variable test1"
    y = ["variable test2"]

    def inner_function():
        #  y="variable test2"         y += "2"   ,  y              、  ,       
        y[0] += "2"
        nonlocal x
        x += "1"
        print(x)
        print(y[0])

    return inner_function


if __name__ == "__main__":
    inner = out_function()  # inner = inner_function
    inner()
    inner()
#      
variable test11
variable test22
variable test111
variable test222
  • 文字列は変更不可変数に属し、変更が必要な場合はリスト要素に変換すればよい.
  • nolocalキーワードを使用すると、実際には外層関数を識別する変数であるため、このときの変数xが外層の変数に直接マッピングされるため、内層関数で直接変更することができる.

  • 4.まとめ
    閉パッケージは一般的なコードテクニックであり、内外層変数値の修正問題については、メモリ割り当ての知識が絡んでおり、コード実行時のメモリ割り当てに関する知識を参考に、深いコピーと結びつけて理解することができる.