ホームページ  >  記事  >  バックエンド開発  >  Python クロージャとは何ですか? Python クロージャの簡単な紹介 (例付き)

Python クロージャとは何ですか? Python クロージャの簡単な紹介 (例付き)

不言
不言転載
2018-10-09 16:51:412838ブラウズ

この記事では、Python クロージャとは何ですか? Python クロージャの簡単な紹介 (例付き) は、一定の参考価値があります。必要な友人は参照してください。お役に立てば幸いです。

クロージャとは何ですか?

実際、この関数を使用すると、誤ってクロージャをトリガーしてしまいます。何らかの理由で、上位層関数の変数が常に関数内で参照または変更されるためです。 will クロージャのトリガー

それでは、クロージャとは何でしょうか?実際、これは関数が入れ子になっているときにトリガーされるルールで、現在の関数が前の関数のローカル名前空間内の変数を参照し、関数自体がオブジェクトとして返されるときにトリガーされます。
クロージャをトリガーする関数をクロージャ関数と呼びます

クロージャの最大の特徴は、外部関数から返された後に変数に代入できることです。

def func1():
    a = 2  #变量a为函数func1()开辟的局部命名空间内定义的变量
    def func2(x):
        return x**a  #函数fun2()内引用了变量a
    print('func2的id:',id(func2))
    return func2 #内层函数名被当作返回值,此时闭包规则达成。
res = func1() # 此时res等同于func2,我们可以看看他们的id完全相同
print('res的id:  ',id(res))
print(res(3))
del func1
print('删除函数func1之后:',res(5))
print(res.__closure__) 
print(type(res.__closure__[0])) 
print(res.__closure__[0].cell_contents) 
#此时,如果函数func2()没有引用外部函数变量a,我们可以试着把return x**a这句改成return x,这时函数func2就没有触发闭包规则
#此时如果再次打印res.__closure__,你会发现输出值为None

以下の出力結果からわかるように、関数 func1 を削除しても、外側の関数で定義されている変数 a は消えてしまいます。理論はまだ使用できます (理論的には a に対応するローカル空間が消滅するので、 a は消滅するはずです) 変数 a がまだ参照できる理由は閉包規則によるものです 外部関数のローカル変数は内部関数によって参照できます外部関数が返された場合でも、関数は返されます。

実際には、関数自体もオブジェクトであり、オブジェクトには多くの属性があり、その中の

closure
属性はクロージャに関連します。 closure
この属性は、セル オブジェクトを含むタプルを定義します。タプル内の各セル オブジェクトは、スコープ内の変数の値を保存するために使用されます。

func2的id: 139940709362136
res的id:   139940709362136
9
删除函数func1之后: 25
#我们来打印一下res的__closure__属性,可以看出它是由cell对象组成的元组
(<cell at 0x7f467c4a8558: int object at 0x5654c2553a40>,)
<class &#39;cell&#39;> #打印类型结果就是元组
2  #打印cell中的值可以看出,这个cell对象中存储的变量值为2
クロージャをトリガーした後は、ローカル空間に依存せずに上位レベルのローカル名前空間変数を参照することができ、変数が配置されている関数が削除されても、クロージャ関数は引き続き使用できます。実際、クロージャ関数はそれを __closure__ 属性に保存します。

以上がPython クロージャとは何ですか? Python クロージャの簡単な紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。