Fonction et liste Python
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Fonction et liste Python



  1. #1
    Lionelno

    Fonction et liste Python


    ------

    Hello ! Je suis sur Python et je ne comprends pas la différence entre ces deux petits programmes, les voici :

    Code:
    def f(liste):
        liste[0] = 2
    
    x = [1, 2]
    f(x)
    print(x)
    Me retourne [2,2]

    alors que le deuxième

    Code:
    def f(liste):
        liste = liste + [1]
    
    x = [3, 4]
    f(x)
    print(x)
    Me retourne [3,4]

    Je ne comprends pas pourquoi la liste du premier petit programme est modifiée en sortant alors que dans le deuxième elle ne l'est pas ...
    Merci de votre aide et bon dimanche

    -----

  2. #2
    CM63

    Re : Fonction et liste Python

    Bonjour,

    Le résultat de la première routine me paraît normal, moi c'est le résultat de la deuxième que je ne comprends pas, je regarde.

  3. #3
    CM63

    Re : Fonction et liste Python

    J'observe que si on le fait directement, ça marche :
    Code:
    x
    [3, 4]
    >>> x+[1]
    [3, 4, 1]
    Donc ce serait une histoire de retour d'argument , je regarde.

  4. #4
    CM63

    Re : Fonction et liste Python

    Oui, c'est ça, c'est un problème de retour de (pointeur sur) argument. Dans les deux cas, tu transmets à la routine le pointeur sur la liste. Dans la première routine on ne fait qu'utiliser ce pointeur en faisant:
    Code:
    liste[0]=2
    Le contenu de la liste est modifié et il n'y a pas de problème de retour d'argument. Alors que dans la deuxième routine, tu crée une nouvelle liste, qui certes porte le même nom , mais qui n'est redéfinie qu'en local dans la routine et qui est perdue quand on revient dans le main. Me comprends-tu ?

  5. A voir en vidéo sur Futura
  6. #5
    CM63

    Re : Fonction et liste Python

    Pour que la deuxième routine modifie effectivement la liste, il faut faire:
    Code:
    def f(liste):
    ...    liste.append(1)
    Ok? Je viens d'essayer, ça marche.

  7. #6
    Lionelno

    Re : Fonction et liste Python

    J'ai un peu de mal avec ta définition de pointeur et de retour d'argument ...

    Dans ma deuxième fonction, laquelle est la nouvelle liste ? Celle qui est avant ou après le '=',

    Oui j'ai vraiment du mal à comprendre pourquoi la première modifie cette liste alors que la deuxième non

  8. #7
    Lionelno

    Re : Fonction et liste Python

    Enfin, pourquoi dans la deuxième fonction, la variable liste est perdue en revenant dans le main, alors que dans la première non ? Pourquoi dans la deuxième on crée on nouvelle variable en local alors que dans la première non ? Vraiment, j'arrive pas à saisir ...

  9. #8
    CM63

    Re : Fonction et liste Python

    Bonjour,

    Citation Envoyé par Lionelno Voir le message

    Dans ma deuxième fonction, laquelle est la nouvelle liste ? Celle qui est avant ou après le '=',
    Celle qui est avant le = est une nouvelle liste créée en local dans la routine. Cette nouvelle liste est une copie de la liste passée en argument. En faisant liste = liste + [1], tu ajoute (1] à cette liste locale, mais tu ne modifie pas la liste d'origine.
    Alors que si on fait liste.append(1), on ne crée pas une liste en local, on modifie la liste d'origine en utilisant son pointeur, et donc ça marche.

    Dans Python les objets de type de base (nombres, chaînes,...) sont transmis par valeur aux routines, alors que les objets de types "élevés" (listes,.., ainsi que objets que tu crée), sont transmis par pointeur. Il faut que tu revoie cela dans le cours afin de voir comment ça marche (si mes explications ne sont pas claires).

    A plus.

  10. #9
    CM63

    Re : Fonction et liste Python

    Citation Envoyé par Lionelno Voir le message
    Enfin, pourquoi dans la deuxième fonction, la variable liste est perdue en revenant dans le main, alors que dans la première non ?
    Parce que dans la première fonction on ne crée pas une nouvelle liste, on ne fait qu'utiliser le pointeur sur la liste créée dans le main.

    Citation Envoyé par Lionelno Voir le message
    Pourquoi dans la deuxième on crée on nouvelle variable en local alors que dans la première non ? Vraiment, j'arrive pas à saisir ...
    Dans la deuxième, en faisant liste=... on crée une nouvelle liste en local, certes copie de la première, mais qui sera perdue lors du retour dans le main puisqu'elle est locale.

  11. #10
    Lionelno

    Re : Fonction et liste Python

    Aaaaaaaaaaaaah !!! C'est bon je l'ai ! Merci beaucoup et bonne journée

  12. #11
    polo974

    Re : Fonction et liste Python

    Juste pour info, ce n'est pas un pointeur mais une référence (en gros un double pointeur, ce qui permet à python de déplacer la donnée en cas de besoin de plus de place...)

    Il faut d'ailleurs se méfier avec python, car lors d'un appel de fonction, quand le type de variable est simple, c'est la valeur qui est passée, mais quand la variable est d'un type plus complexe, c'est la référence qui est passée...
    Jusqu'ici tout va bien...

Discussions similaires

  1. Preuve d'invariant de boucle/somme d'une liste/python
    Par FarWaR dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 08/11/2015, 09h28
  2. Python: liste de listes
    Par BienZen dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 14/09/2014, 10h59
  3. fonction (min d'une liste) (python)
    Par afaf1995 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 24/02/2014, 08h29
  4. PYTHON - tirage avec probabilité dans une liste
    Par invitef702cf04 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 01/05/2012, 22h48
  5. Python - Peut-on lire un fichier et envoyer les lignes dans une liste au lieu d'une string ?
    Par invitef702cf04 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 21/02/2012, 12h40