Je suis un programmeur C / C ++ (et dans une certaine mesure de degré Java). J'apprends Python, mais je suis déconcerté à des comportements étranges (pour mes backgroung) de la langue.
J'apprends à propos de la fonction et des fermetures imbriquées (lecture "L'apprentissage de python", qui semble une très bonne source pour moi). p>
Je comprends que si j'envère un def à l'intérieur d'une boucle quand je Appelez la fonction créée, il lue la dernière valeur de la variable de boucle capturée (car elle capture par référence, en tant que programmeur C ++ le mettrait) p> et exécuté le programme Le résultat est P> for f in funcs:
f()
2
2
2
2
3 Réponses :
Vos fonctions Imprimez la valeur actuelle de si vous écrivez p> alors si vous écrivez p> alors i code>. p>
i code> est en cours de configuration sur
0,1,2,3 code> comme vous passez la boucle. C'est ce que
pour i dans la plage (4) code> signifie. P>
i code> continue avec toute la valeur qu'il avait déjà. p> p>
Tout d'abord, cela crée une liste de quatre fonctions.
funcs = [] for i in range(4): def f(num=i): print(num) funcs.append(f)
Il n'y a pas d'incompatibilité ici. La valeur de si vous exécutez p> vous redéfinissez la valeur de n'affectera pas la valeur de i code> dans
f () code> dépend de la valeur de
i code> de la portée des parents. Après avoir exécuté le premier
pour i in gamme (4) code>
i code> a la valeur du dernier élément de la plage code> code>, qui est 3 et donc tous les appels ultérieurs vers
i Code> à chaque étape d'itération, vous obtenez donc
0,1,2,3 code> comme les valeurs imprimées par
f code>. Faire p>
i code> et donc vous obtiendrez
3 code> comme valeur du
i code> dans tous les appels de fonction p> p>
Votre premier code posté ne fonctionne pas comme vous vous attendez à ce que l'indentation est fausse.
Désolé, c'est une erreur de pâte de copie, mon code a raison, la modifiant maintenant
Je pense que vous avez gâché l'indentation sur
funcs.append (f) code>. Je pourrais être hors de tri ici, mais
impression (i) code> imprimera le dernier
i code> généré. Dans votre cas, c'est
pour i in gamme (4): code> et non lorsque vous avez défini la fonction. Donc, ce n'est pas étrange que vous soyez getnig cette sortie. Donc,
i code> n'est pas congelé lors de la création de fonction, mais c'est une valeur en direct. Vous imprimez la dernière valeur connue / définie de
i code>.
Si j'exécute le programme lorsque vous avez édité, la sortie est juste une «3» ...
Je ne peux pas non plus reproduire le deuxième exemple. Veuillez corriger les indentations et écrire le code complet afin que nous puissions vous aider!
@mrcarnivore Quel est le problème avec l'indentation? C'est juste un bloc de déclaration avec une indentation d'un niveau
@Torxed the append () appel est à l'intérieur de la boucle pour la boucle, car je dois créer une liste d'objets de fonction
@Luca oui sûr. J'ai édité votre question avant de l'éditer trois fois de suite, car j'avais supposé que c'était le cas. Cependant.
impression (i) code> n'imprimera pas le
i code> à partir du
def f () code> -loop, mais plutôt le
pour i in gamme (4): Funcs [i] () code> -Loop. Voir mon commentaire ci-dessus.
Bien que les réponses ci-dessous a déjà déjà dit, vous voudrez peut-être consulter les explications Ici et ici .