CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[python] Pourquoi ce bout de code...

Lagrangien
Lagrangien
Niveau 8
29 novembre 2013 à 23:29:08

Je veux créer des fonctions à la volée, mais je suis confronté à un problème.

Voici un exemple (inutile dans la pratique) de ce que je veux faire:

http://pastebin.com/s5NbQu90

À la fin, mes trois fonctions renvoient la même valeur, parce que ce sont en fait toutes des fonctions math.sin... Mais pourquoi? :(

Merci

Pseudo supprimé
Pseudo supprimé 29 novembre 2013 à 23:58:09

Je connais pas trop le python mais c'est sûrement un probleme de closure, name capture juste sa dernière valeur.
Tu dois éventuellement pouvoir faire comme ça sinon :
new_funcs[name] = (lambda name: lambda x: funcs_dict[name](x))(name)

Pseudo supprimé
Pseudo supprimé 30 novembre 2013 à 00:06:19

avec cpython, l’implémentation des lambdas est dégueulasse. en faite quand tu fait

    for name in funcs.keys():
        new_funcs[name] = lambda x: funcs[name](x)

le lambda n'est pas créé avec la valeur de name a ce moment là mais est créé avec
une référence vers name. donc plus tard, quand tu changes la valeur de name, ca la
change aussi dans le lambda.

un exemple:
    a = 7
    foo = lambda x: x+a
    print( foo(8) ) # affiche 15
    a = 100
    print( foo(8) ) # affiche maintenant 108 car le lambda fait 8+a et non 8+7

EncoreUnNouveau
EncoreUnNouveau
Niveau 10
30 novembre 2013 à 21:21:47

Il sort d'ou ton "funcs" ?

Lagrangien
Lagrangien
Niveau 8
02 décembre 2013 à 10:13:26

funcs = funcs_dict, faute de copier/coller^^

elite_2009 : du coup, si au lieu d'utiliser name j'utilise une copie de name faite pour chaque nouvelle key, ça devrait marcher non?

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment