Maison > développement back-end > Tutoriel Python > Pourquoi le comportement de fermeture de Python produit-il des résultats inattendus dans les boucles imbriquées ?

Pourquoi le comportement de fermeture de Python produit-il des résultats inattendus dans les boucles imbriquées ?

DDD
Libérer: 2024-11-29 00:09:12
original
534 Les gens l'ont consulté

Why Does Python's Closure Behavior Produce Unexpected Results in Nested Loops?

Comprendre les fermetures lexicales : un examen plus approfondi du comportement de fermeture de Python

En plongeant dans les subtilités des fermetures lexicales, un comportement particulier dans le code Python devient évident. Prenons l'exemple 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

À notre grande surprise, ce code affiche "4 4 4" au lieu du "0 2 4" attendu. Ce comportement inattendu provient de la façon dont Python gère les fermetures lexicales.

Contrairement à Perl, qui crée une nouvelle fermeture pour chaque itération, Python crée trois fonctions distinctes. Cependant, chaque fonction conserve la fermeture de l'environnement dans lequel elle a été définie, à savoir l'environnement global. Cette fermeture partagée fait que chaque fonction fait référence à la même variable mutable i, conduisant à un résultat inattendu.

Pour résoudre ce problème, une solution modifiée doit être utilisée. En introduisant un créateur de fonction et en l'invoquant dans la boucle, nous créons des environnements distincts pour chaque fonction avec une valeur i unique :

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

Ce code révisé corrige le problème, démontrant les différences subtiles mais significatives dans la façon dont Python et Perl gèrent les fermetures lexicales. En comprenant le comportement de fermeture du langage de programmation spécifique utilisé, les développeurs peuvent éviter de tels résultats inattendus et écrire un code plus robuste et plus prévisible.

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