Maison > développement back-end > Tutoriel Python > Pourquoi cet exemple de fermeture Python imprime-t-il « 4 4 4 » au lieu de « 0 2 4 » ?

Pourquoi cet exemple de fermeture Python imprime-t-il « 4 4 4 » au lieu de « 0 2 4 » ?

Patricia Arquette
Libérer: 2024-11-29 08:12:10
original
186 Les gens l'ont consulté

Why Does This Python Closure Example Print

Comprendre les fermetures lexicales : une énigme Python

Dans le domaine de la programmation fonctionnelle, les fermetures lexicales jouent un rôle crucial. Cependant, certains langages de programmation peuvent introduire des complexités dans la compréhension de leur comportement. Python, par exemple, propose un puzzle intrigant qui illustre l'interaction des fermetures et des environnements.

L'extrait de code Python suivant sert d'exemple :

flist = []

for i in xrange(3):
    def func(x): return x * i
    flist.append(func)

for f in flist:
    print f(2)
Copier après la connexion

Ce code affiche étonnamment "4 4 4" au lieu du "0 2 4" attendu. Même si l'on pourrait initialement soupçonner que la variable globale i est partagée entre les fonctions, le problème persiste même lorsque i est déclaré localement au sein d'une fonction imbriquée.

La clé pour comprendre ce comportement réside dans le concept de fermetures. En Python, chaque fonction imbriquée conserve la fermeture de sa portée conteneur. Dans ce cas, les fonctions imbriquées partagent la fermeture de l'environnement global, y compris la variable mutable i. Comme i est modifié au cours de la boucle, toutes les fonctions font référence à la valeur modifiée.

Pour contourner ce problème et garantir le comportement souhaité, on peut recourir à une approche de créateur de fonction. En appelant une fonction de créateur au lieu de créer des fonctions en ligne, des environnements distincts sont établis pour chaque fonction créée.

Voici un exemple du code révisé :

flist = []

for i in xrange(3):
    def funcC(j):
        def func(x): return x * j
        return func
    flist.append(funcC(i))

for f in flist:
    print f(2)
Copier après la connexion

Cette approche génère efficacement des fonctions distinctes avec fermetures uniques, conduisant au résultat attendu de "0 2 4".

Ainsi, bien que les fermetures offrent des capacités puissantes, leur interaction avec les environnements peut introduire de subtiles complexités. Un examen attentif de la portée et des nuances des fermetures est essentiel pour exploiter leur plein potentiel.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal