Maison > développement back-end > Tutoriel Python > Pourquoi le comportement de fermeture lexicale de Python diffère-t-il de celui de Perl et comment cela peut-il être résolu ?

Pourquoi le comportement de fermeture lexicale de Python diffère-t-il de celui de Perl et comment cela peut-il être résolu ?

Barbara Streisand
Libérer: 2024-12-01 14:46:13
original
787 Les gens l'ont consulté

Why Does Python's Lexical Closure Behavior Differ from Perl's, and How Can This Be Resolved?

Comprendre les fermetures lexicales en Python : un examen plus approfondi

Dans le domaine de la programmation, les fermetures lexicales jouent un rôle crucial dans le maintien de l'accès aux variables et les fonctions définies dans les étendues englobantes. Cependant, un phénomène déroutant peut survenir lorsque vous travaillez avec des fermetures en Python.

L'énigme de la fermeture en Python

Considérez le code Python suivant :

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

Étonnamment, ce code affiche « 4 4 4 » au lieu du « 0 2 4 » attendu. Pour comprendre ce comportement, nous devons approfondir la nature des fermetures lexicales en Python.

Comportement de fermeture en Python et Perl

En Python, les fermetures conservent les références aux variables dans le cadre englobant. Cependant, si ces variables sont modifiées dans cette portée, les fermetures captureront les valeurs modifiées, conduisant à des résultats inattendus.

Ce comportement contraste avec Perl, où les fermetures capturent l'environnement au moment de leur création. Dans le code Perl :

my @flist = ();

foreach my $i (0 .. 2) {
    push(@flist, sub {$i * $_[0]});
}
Copier après la connexion

Chaque fermeture capture la valeur de $i au moment de sa création, ce qui donne le résultat attendu : "0 2 4."

Résoudre l'énigme

Pour résoudre le problème en Python, nous pouvons créer des fonctions dans une autre fonction pour isoler les fermetures environnements.

flist = []

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

outer()

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

Ici, chaque itération de la boucle externe crée une nouvelle fonction qui a son propre environnement et une valeur unique de i. En conséquence, nous obtenons le résultat souhaité : "0 2 4."

Conclusion

Les fermetures lexicales fournissent un mécanisme puissant pour accéder aux variables et aux fonctions dans toutes les portées. Cependant, en Python, il est crucial de comprendre les implications de la fermeture sur des variables mutables, car cela peut conduire à un comportement inattendu. En gérant soigneusement les environnements dans lesquels les fermetures sont créées, nous pouvons exploiter tout leur potentiel tout en évitant les pièges.

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