IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Paramètre par défaut statique


Sujet :

Python

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut Paramètre par défaut statique
    Bonjour

    Je viens de tester le code suivant
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    >>> def x(a, b=[]):
    ...     print "avant: ", b
    ...     b.append(a)
    ...     print "après: ", b
    ... 
    >>> 
    >>> x(1)
    avant:  []
    après:  [1]
    >>> x(2)
    avant:  [1]
    après:  [1, 2]
    >>> x(3)
    avant:  [1, 2]
    après:  [1, 2, 3]
    >>> x(1)
    avant:  [1, 2, 3]
    après:  [1, 2, 3, 1]

    Quelqu'un saurait expliquer pourquoi le paramètre b (local à la fonction) se remplit et garde ses valeurs d'appels en appels et ne reprend pas sa valeur par défaut ???

    Tandis que cet autre code
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> def x(a=10):
    ...     print a
    ... 
    >>> 
    >>> x()
    10
    >>> x(2)
    2
    >>> x()
    10
    >>> x(5)
    5
    >>> x()
    10

    Quasiment analogue au premier (remplissage du paramètre) fonctionne correctement (au 3° appel je vois bien que le paramètre n'a pas gardé la valeur 2 du second appel et a repris sa valeur par défaut)...

    ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Hello,

    C'est normal. Une liste est un objet mutable dont l'instance est créée à l'initialisation (la déclaration) de la fonction, et non pas à l'utilisation.

    Tu peux vérifier ce comportement avec un test du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    >>> class A:
    ...     def __init__(self):
    ...         print 'init A'
    ... 
    >>> def test(a=A()):
    ...    pass
    ... 
    init A # initialisation de A alors qu'on a pas appelé la fonction !
    >>> test()
    >>># pas de réinitialisation de A
    Tu as appris un truc aujourd'hui : On utilise jamais un mutable en paramètre par défaut d'une fonction (ou alors on sait exactement pourquoi)

    Pour utiliser un mutable par défaut, tu n'a pas le choix de passer par quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> def test(a=None):
    ...    a = a or []
    Pourfendeur de singletons en croisade

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    Hello,

    C'est normal. Une liste est un objet mutable dont l'instance est créée à l'initialisation (la déclaration) de la fonction, et non pas à l'utilisation.
    Je comprends.

    Citation Envoyé par Petibidon Voir le message
    Tu peux vérifier ce comportement avec un test du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    >>> class A:
    ...     def __init__(self):
    ...         print 'init A'
    ... 
    >>> def test(a=A()):
    ...    pass
    ... 
    init A # initialisation de A alors qu'on a pas appelé la fonction !
    >>> test()
    >>># pas de réinitialisation de A
    Je vois

    Citation Envoyé par Petibidon Voir le message
    Tu as appris un truc aujourd'hui
    Ouais.

    Citation Envoyé par Petibidon Voir le message
    On utilise jamais un mutable en paramètre par défaut d'une fonction (ou alors on sait exactement pourquoi)
    Pour utiliser un mutable par défaut, tu n'a pas le choix de passer par quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> def test(a=None):
    ...    a = a or []
    Ca c'est pas mal. Merci
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Paramètre par défaut dans une fonction
    Par RobinJulie dans le forum Windows Forms
    Réponses: 5
    Dernier message: 18/01/2012, 14h07
  2. Restaurer les paramètres par défaut au démarrage
    Par Manu14400 dans le forum Access
    Réponses: 1
    Dernier message: 22/09/2005, 15h21
  3. Passage d'un type procédure en paramètre par défaut
    Par Floverdoz dans le forum Langage
    Réponses: 1
    Dernier message: 22/07/2005, 17h48
  4. Réponses: 2
    Dernier message: 19/03/2005, 17h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo