• [^] # Re: la valeur par défaut n'est évaluée qu'une fois

    Posté par (site web personnel) . En réponse au journal Python et valeurs par défaut des paramètres. Évalué à 5.

    C'est même extrêmement important à comprendre au sujet des lambda :

    i = 1
    # i est résolu dans l'espace de nommage courant
    lambda1 = lambda : i
    # i est résolu une fois à la création de la lambda et c'est ensuite le i "local" qui est résolu à l'execution
    lambda2 = lambda i=i: i
    print "lambda1:",lambda1() # 1 (i global)
    print "lambda2:",lambda2() # 1 (i à la création)
    i = 2
    print "lambda1:",lambda1() # 2 
    print "lambda2:",lambda2() # 1
    
    

    Et en beaucoup plus vicieux :

    def create_mult_functions_bad(coefs):
     # toutes les lambda utilisent le même coef.
     # il est résolu a l’exécution des lambda. À ce moment là coef == coefs[-1]
     return [lambda val : val*coef for coef in coefs]
    def create_mult_functions(coefs):
     # coef est résolu à la création de la lamdba
     return [lambda val, coef=coef: val*coef for coef in coefs]
    mult1, mult2, mult3 = create_mult_functions_bad([1,2,3])
    print mult1(1) # 3
    print mult2(1) # 3
    print mult3(1) # 3
    mult1, mult2, mult3 = create_mult_functions([1,2,3])
    print mult1(1) # 1
    print mult2(1)# 2
    print mult3(1) # 3
    
    

    Matthieu Gautier|irc:starmad