Maison > développement back-end > Tutoriel Python > Qu'est-ce qu'une fermeture Python ? Une brève introduction aux fermetures Python (avec des exemples)

Qu'est-ce qu'une fermeture Python ? Une brève introduction aux fermetures Python (avec des exemples)

不言
Libérer: 2018-10-09 16:51:41
avant
2885 Les gens l'ont consulté

Le contenu de cet article porte sur qu'est-ce que la fermeture Python ? Une brève introduction aux fermetures Python (avec des exemples) a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer, j'espère qu'elle vous sera utile.

Qu'est-ce qu'une fermeture ?

En fait, nous déclencherons par inadvertance des fermetures lors de l'utilisation de fonctions, car pour une raison quelconque, les variables de la couche supérieure des fonctions seront toujours référencées ou modifiées dans la fonction, et cela déclenchera ensuite la fermeture

Alors, qu’est-ce qu’une fermeture ? En fait, c'est une règle qui se déclenche lorsque des fonctions sont imbriquées. Cette règle est déclenchée lorsque la fonction actuelle fait référence à une variable dans l'espace de noms local de la fonction précédente et que la fonction elle-même est renvoyée en tant qu'objet.
Nous disons que la fonction qui déclenche la fermeture est appelée une fonction de fermeture

La plus grande caractéristique de la fermeture est qu'elle peut être renvoyée par la fonction externe puis affectée à une variable, et elle transporte les variables définie dans la fonction externe

L'exemple est le suivant :

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
Copier après la connexion

Comme le montrent les résultats de sortie ci-dessous, même si la fonction func1 est supprimée, la variable a qui devrait disparaître en théorie peut encore être utilisé (théoriquement l'espace local correspondant à a disparaît, alors a devrait disparaître). La raison pour laquelle la variable a peut encore être référencée est à cause des règles de fermeture. Les variables locales de la fonction externe peuvent être référencées par le. fonction interne, même si la fonction externe est revenue.
En fait, la fonction elle-même est aussi un objet, et les objets ont de nombreux attributs, parmi lesquels celui lié à la fermeture est l'attribut closure. L'attribut
closure définit un tuple contenant des objets cellule, où chaque objet cellule du tuple est utilisé pour enregistrer la valeur de la variable dans la portée.

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
Copier après la connexion

Après avoir déclenché la fermeture, il est possible de référencer la variable d'espace de noms local de couche supérieure sans compter sur l'espace local. Même si la fonction dans laquelle se trouve la variable est supprimée, la fonction de fermeture peut. utilisez-le toujours. En fait, la fonction de fermeture l'enregistre dans l'attribut __closure__.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal