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 :

[DEB]Modification d'une liste dans une fonction par appel depuis une autre fonction [Python 3.X]


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2012
    Messages : 112
    Points : 98
    Points
    98
    Par défaut [DEB]Modification d'une liste dans une fonction par appel depuis une autre fonction
    Bonsoir à tous .
    Ce bout de code a été simplifié pour le problème.
    On modifie une liste E[x] et on veut récupérer cette liste modifiée dans une autre liste nommée Voie[] en utilisant au passage une liste provisoire Pro[].
    Ceci se passe dans la fonction autrechemin() (il s'agit d'un travail sur les graphes).
    Tout va bien si on fait l'appel depuis le corps du programme. Mais en fait j'appelle autrechemin() depuis une fonction nommée test() et là,impossible de récupérer la liste modifiée Voie pour le corps du programme.
    Y-a-t'il une solution ?
    En vous remerciant de m'avoir consacré de votre temps

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    import copy
    def autrechemin(her,long) :
     
        for i in range (len(Ex)-1):
            #Creation d'une liste provisoire destinée a être vidée
            Pro.append(Ex[i])
     
        #Transmission de Pro à la liste Voie destinée au corps du programme     
        Voie=copy.deepcopy(Pro)
     
        del(Pro[:])
        print('Liste Voie',Voie)
        return Voie
     
    def test(her,long)  :
        autrechemin(her,long)
     
    ######################################################################  
    Pro=[]
    Voie=[]    
    Ex=['a', 'c', 'b', 'e']
    her=Ex[3]
    long=len(Ex)
    #appel direct à partir d'ici qui fonctionne 
    #Voie=autrechemin(her,long) ceci marche
     
    #appel de la première fonction Ceci ne marche pas
    test(her,long)
     
    print('Voie terminale',Voie)

  2. #2
    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
    Citation Envoyé par torquemada Voir le message
    Y-a-t'il une solution ?
    Récupérer le retour de la fonction?
    Apprendre à utiliser les variables globales?
    Profiter de ce que la liste soit "mutable"?

    Ouvrir un tuto. et d'apprendre ces notions de base est une bonne solution...

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

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2012
    Messages : 112
    Points : 98
    Points
    98
    Par défaut
    Ouvrir un tuto. et d'apprendre ces notions de base est une bonne solution...
    Je n'aurais pas osé poser ma question sans avoir fait ce préalable .
    Faire un liste conjointe type Maliste= Voie en profitant de la mutabilité ne donne pas plus de résultat.
    Faire un appel type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def test(her,long)  :
       Voie= autrechemin(her,long)
        return Voie
    n'est pas accepté.
    Je m'étonnais aussi du fait que cela fonctionne pour un appel direct dans le corps du programme et pas pour un appel par l'intermédiaire d'une fonction.
    Après tout on peut dire que les listes sont déclarées au niveau "global"

  4. #4
    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
    Citation Envoyé par torquemada Voir le message
    Je n'aurai pas osé poser ma question sans avoir ce préalable.
    Bah... Si tel est le cas, vous pourriez "tester"...
    On crée une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> v = list('abc')
    >>> v
    ['a', 'b', 'c']
    >>>
    Puis on fabrique une fonction qui retourne une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> def test():
    ...     v = list(range(4))
    ...     return v
    ...
    Si on se contente d'appeler la fonction sans assigner son retour à "v", aucune raison pour que "v" change:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> test()
    [0, 1, 2, 3]
    >>> v
    ['a', 'b', 'c']
    >>>
    En assignant le retour, c'est mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> v = test()
    >>> v
    [0, 1, 2, 3]
    On peut aussi utiliser les variables globales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> v = list('abc')
    >>> def test():
    ...     global v
    ...     v = list(range(4))
    ...
    >>> test()
    >>> v
    [0, 1, 2, 3]
    >>>
    et dans ce cas, plus besoin de "return".
    On peut aussi utiliser liste comme mutable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> v = list('abc')
    >>> def test():
    ...     v[:] = list(range(4))
    ...
    >>> test()
    >>> v
    [0, 1, 2, 3]
    >>>
    Vous devriez pouvoir tester par vous même ces solutions (quelques lignes) et choisir la plus adaptée à votre cas. Et si vous êtes aussi peu confiant sur fonction, portée des variables, objets mutables,... désolé de dire çà mais, c'est que vous avez sauté quelques étapes côté "tuto".

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

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2012
    Messages : 112
    Points : 98
    Points
    98
    Par défaut
    Merci pour vos nombreuses collaborations.
    Je n'ai pas eu le temps d'approfondir vos réponses mais ,à première vue ce que vous me proposez ce sont les réponses des fameux tutos ; c'est à dire un appel du corps du pgrm vers une fonction et retour . une structure pgrm fonction1 et retour
    Ici le problème vient , me semble -t'il , que l'appel est de structure pgr- fonction1- fonction 2 et retour de la fonction 2 vers le pgrm et c'est cela qui coince.
    Merci de votre intérêt pour cette question.

  6. #6
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Bonjour,

    Normal si tu n'essayes pas de comprendre la réponse de @wiztricks !
    Il faut pas seulement lire bêtement, mais aussi essayer de comprendre les explications qui te sont donné !

    1er cas - tu retourne la liste :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import copy
     
    def autrechemin(her,long) :
     
        for i in range (len(Ex)-1):
            Pro.append(Ex[i])
     
        Voie=copy.deepcopy(Pro)
     
        del(Pro[:])
        print('Liste Voie',Voie)
        return Voie
     
    def test(her,long)  :
        return autrechemin(her,long)
     
    ######################################################################  
    Pro=[]
    Voie=[]  
    Ex=['a', 'c', 'b', 'e']
    her=Ex[3]
    long=len(Ex)
    #appel direct a partir d'ici qui fonctionne 
    #Voie=autrechemin(her,long) ceci marche
     
     
    Voie=test(her,long)
     
    print('Voie terminale',Voie)
    2eme cas - tu utilise une variable globale :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    import copy
     
    def autrechemin(her,long) :
     
        for i in range (len(Ex)-1):
            Pro.append(Ex[i])
     
        global Voie
        Voie=copy.deepcopy(Pro)
     
        del(Pro[:])
        print('Liste Voie',Voie)
     
    def test(her,long)  :
        autrechemin(her,long)
     
    ######################################################################  
    Pro=[]    
    Ex=['a', 'c', 'b', 'e']
    her=Ex[3]
    long=len(Ex)
    #appel direct a partir d'ici qui fonctionne 
    #Voie=autrechemin(her,long) ceci marche
     
     
    test(her,long)
     
    print('Voie terminale',Voie)
    je te laisse faire si tu le souhaites le troisième cas .
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2012
    Messages : 112
    Points : 98
    Points
    98
    Par défaut
    Merci à tous

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/03/2013, 16h36
  2. Réponses: 2
    Dernier message: 14/05/2011, 01h08
  3. Réponses: 1
    Dernier message: 30/06/2008, 12h55
  4. Réponses: 7
    Dernier message: 28/06/2007, 11h08
  5. Appel d'une liste dans une liste (JSTL)
    Par abalgue dans le forum Hibernate
    Réponses: 4
    Dernier message: 15/06/2007, 10h56

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