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 :

Passage de paramètres


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Passage de paramètres
    Soit le programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def permut(a,b):
      a,b=b,a 
     
    def permut2(a,b):
      a,b=b,a 
      return a,b
    Pour le premier programme, les varaiables ne sont pas permutées, pour le 2ème ca fonctionne
    Pourriez vous me dire pourquoi?

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    le passage de paramètre par référence ne s'applique que sur les variables dites mutables:

    Variables non mutables (immutable): int, float, str, tuple, ...
    Variables mutables: list, dict, set, valeurs d'instance d'une classe, ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def permut(a, b):
        a, b = b, a
    >>> var1 = 1
    >>> var2 = 2
    >>> permut(var1, var2)
    >>> var1
    1
    >>> var2
    2


    Sauf qu'on ne peut pas échanger les objects, seulement leur contenu, dans le cas d'une liste il faut transférer son contenu par méthode de slicing.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def permut(a, b): # pour une seule valeur
        a[0], b[0] = b[0], a[0]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def permut(a, b): # pour tout le tableau
        a[:], b[:] = b[:], a[:]
    >>> var1 = [1,]
    >>> var2 = [2,]
    >>> permut(var1, var2)
    >>> var1
    [2]
    >>> var2
    [1]


    Pour pouvoir permuter les variables mutables il suffit de retourner une tuple inversée et l'appliquer sur cette même tuple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def permut(a, b):
        return b, a

    >>> var1 = 1
    >>> var2 = 2
    >>> var1, var2 = permut(var1, var2)
    >>> var1
    2
    >>> var2
    1


    La fonction permut va retourner une tuple (2, 1) qui va réaffecter les valeurs var1, var2
    comme ceci: a, b, c = 1, 2, 3

    var1, var2 = permut(var1, var2) équivaut à écrire a, b = b, a. Il est possible de modifier les valeurs retournées dans la fonction, exemple: return b*2, a*4


    Voici un guide complet sur le sujet et les différentes méthodes: How do I write a function with output parameters (call by reference)?

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    La permutation a bien lieu dans la première fonction aussi mais elle ne sert pas à grand chose puisqu'elle ne retourne rien.

    Plus clairement:
    Code : 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
    19
    20
     
    >>> a, b = 7, 'e'
    >>> def permut(a, b):
    ...     a, b = b, a
    ...     print('a: %s, b: %s' %(a, b))
    ... 
    >>> def permut_and_return(a, b):
    ...     a, b = b, a
    ...     return a, b
    ... 
    >>> a, b = permut_and_return(a, b)
    >>> print('a: %s, b: %s' %(a, b))
    a: e, b: 7
    >>> # on recommence
    ... a, b = 7, 'e'
    >>> permut(a, b)
    a: e, b: 7
    >>> print('a: %s, b: %s' %(a, b))
    a: 7, b: e
    >>>
    La fonction permut() fait son travail mais cela n'a aucun effet sur a et b de l'espace de nom global.

    Dans la fonction permut() a et b n'existe que dans son espace de nom et ne sont pas les mêmes que les a et b de départ.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    La deuxième fonction "marche" à condition d'assigner les objets retournés aux mêmes variables globales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a, b = 0, 1
    a, b = permuter(a, b)
    Mais si vous aviez écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a, b = 0, 1
    u, v = permuter(a, b)
    les objets assignés à a, b ne changent pas.

    C'est une conséquence de ce que Python appelle espaces "locals" et "globals" et du comportement d'une fonction.
    Et si cela ne vous paraît pas logique, s'en accommoder fait partie de l'apprentissage d'un langage.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [Forms]Passage de paramètre entre Forms et Reports
    Par jack554 dans le forum Reports
    Réponses: 4
    Dernier message: 30/03/2004, 13h58
  2. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15
  3. [XSL] Passage de paramètres à un template
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/06/2003, 13h28
  4. passage de paramètres
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/02/2003, 17h28
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

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