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 liste par valeur à une fonction


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 36
    Points : 17
    Points
    17
    Par défaut Passage de liste par valeur à une fonction
    Bonjour,
    je souhaite passer une liste à une fonction, que celle-ci bricole un peu dessus et renvoie une autre liste sans que celle passée en arg ne soit modifiée...
    Je ne vois pas comment faire. Avec la mécanique de python qui dit que tt objet modifiable est passé par référence, je ne vois pas comment faire. J'ai envoyé une copie comme argument, c'est pareil.
    J'ai fais une copie directement dans la fonction avant modifs et retourné la copie mais la liste initiale est toujours modifiée.
    Y a-t-il une solution? Ou dois-je oublier les liste dès que je veux utiliser des fonctions?
    Merci,
    Philippe.

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def mafunc(uneliste):
        ....
        return monautreliste
     
    monautreliste = mafunc(uneliste)
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Février 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2003
    Messages : 95
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    PauseKawa, je pense que tu réponds à côté du sujet : la question n'est pas "comment retourner une liste ?" mais "comment faire une copie d'une liste et non créer une nouvelle référence sur le même objet liste ?"

    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneautreliste = uneliste
    , qui crée une nouvelle référence sur la même liste, il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneautreliste = [elem for elem in uneliste]
    qui va bien créer un nouvel objet liste.

    Attention : si des éléments de la liste sont des objets modifiables, dans la nouvelle liste on retrouvera des références vers ces objets ...

    Mathieu
    Un verre vide se plaint, un verre plein se vide ...

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par mayadev Voir le message
    je souhaite passer une liste à une fonction, que celle-ci bricole un peu dessus et renvoie une autre liste sans que celle passée en arg ne soit modifiée...
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si j'ai bien compris le pb, voilà une solution simple que j'ai déjà utilisée. Il s'agit simplement de ne travailler qu'avec une copie de l'argument passé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    x = [1,2,3,4,5]
     
    def test(L):
        R = list(L)
        R[3] = 9
        return R
     
    y = test(x)
    print y
    print x
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [1, 2, 3, 9, 5]
    [1, 2, 3, 4, 5]
    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Une liste étant un objet qui contient d'autres objets, elle est sujette à 3 formes de "copy" dénommée identité, shallow et deep.
    Ca fait des choses bizarres comme illustré dans le code ci dessous:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    import copy
     
    class Foo:
        def __init__(self, name):
            self.name = name
        def __cmp__(self, other):
            return cmp(self.name, other.name)
     
    def compare(a, b):
        print 'contenu de a:', a
        print 'contenu de b:', b
        print 'adresses egales (b is a):', (b is a)
        print 'contenus égaux (b == a):', (b == a) # les contenus
        print 'par adresse (b[0] is a[0]):', (b[0] is a[0]) # contenu identique
        print 'par valeur (b[0] == a[0]):', (b[0] == a[0]) # retour de __cmp__
     
     
    a = Foo('a')
    li = [ a ]
     
    print 'identite'
    """ dans ce cas li et li_copy reférencent la même adresse
    compare doit affichier des True partout.
    """
    li_copy = li
    compare (li, li_copy)
     
    print 'shallow copy'
    """ dans ce cas li et li_copy ont des adresses différentes
    compare doit affichier b is a = False et le reste 'True'
    """
    li_copy = copy.copy(li)
    compare (li, li_copy)
     
    print 'deep copy'
    """ dans ce cas li et li_copy ont des adresses différentes
    et contiennent des objets differents mais égaux au sens de __cmp__
    """
    li_copy = copy.deepcopy(li)
    compare (li, li_copy)

    Vous voulez copier quoi, comment?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    Avec une copie de liste simple : un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> a = [1,2,3]
    >>> b = a[:]
    >>> b.append(4)
    >>> a
    [1, 2, 3]
    >>> b
    [1, 2, 3, 4]

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 36
    Points : 17
    Points
    17
    Par défaut
    Merci à tous, et désolé de revenir tard sur le sujet!
    Ce qui me bloquait était que je passais une liste à une fonction, et que je voulais apporter des modifs sur une copie de cette liste et renvoyer la liste modifiée. Mais comme je ne connaissais que
    liste2 = liste1 #ce qui est maigre me direz-vous
    à chaque modification de liste2, liste1 était aussi modifiée, même en copiant les éléments un par un.
    En épluchant diveIntoPython je suis tombé sur une petite astuce qui m'a bien débloqué:
    liste2 = liste1[:]
    ce que me donne tamiel comme solution simple et suffisante.

    Par ailleurs merci à wiztricks et son exemple complet "objet", qui demande une étude plus approfondie pour moi, mais qui semble bien complète, et qui , une fois bien digérée, fera que je ne vous ennuierais plus sur ce sujet.
    Mais il y en aura d'autres, c'est sûr
    Merci à tous.
    Philippe.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/01/2013, 14h08
  2. [WD8] Passage de paramètre par valeur à une sub avec une dll .net
    Par didierbi dans le forum WinDev
    Réponses: 3
    Dernier message: 19/06/2009, 17h21
  3. Réponses: 8
    Dernier message: 06/05/2008, 11h52
  4. passer un tableau d'entier par valeurs à une fonction
    Par piotrr dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 18/12/2007, 01h16
  5. Valeur par défaut à une fonction
    Par ploxien dans le forum Langage
    Réponses: 2
    Dernier message: 03/05/2007, 09h06

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