Maison >développement back-end >Tutoriel Python >Pourquoi les Lambdas dans les boucles For capturent-ils uniquement la dernière valeur ?
Lambda dans la boucle For ne capture que la dernière valeur
Lors de l'utilisation d'une fonction lambda dans une boucle for, il est crucial de comprendre son comportement par rapport aux paramètres locaux. capture de variables. Par défaut, un lambda capture les valeurs des variables locales au moment où le lambda est défini. Cependant, si ces variables changent dans la boucle, le lambda capturera toujours la valeur finale qu'elles prennent.
Exemple de code :
Considérez le code suivant :
options = ["INFO", "WARNING", "DEBUG"] for i in range(len(options)): option = options[i] __cMenu.add_command( label="{}".format(option), command=lambda: self.filter_records(column, option) )
Ce code vise à créer plusieurs lambdas, chacun capturant une valeur différente de la variable d'option. Cependant, lorsque ces lambdas sont exécutés, ils se comportent tous comme si l'option était définie sur "DEBUG", la dernière valeur qu'elle prend dans la boucle.
Raison :
Ce comportement se produit car les noms dans les corps de fonction des lambdas sont évalués lorsque la fonction est exécutée. Par conséquent, dans le code fourni, la variable d'option est évaluée lorsque chaque lambda est appelé, ce qui entraîne la capture de la valeur finale de l'option uniquement.
Solution :
Pour éviter ce problème, il est nécessaire de capturer la valeur de l'option au moment où le lambda est défini. Ceci peut être réalisé en attribuant une option à une nouvelle variable dans le lambda, comme le montre le code modifié ci-dessous :
options = ["INFO", "WARNING", "DEBUG"] for i in range(len(options)): option = options[i] __cMenu.add_command( label="{}".format(option), command=lambda opt=option: self.filter_records(column, opt) )
En utilisant le paramètre opt dans le lambda, la valeur de l'option est capturée au moment le lambda est créé, garantissant que chaque lambda fonctionne avec la bonne valeur.
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!