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 :

Python list, incompréhension


Sujet :

Python

  1. #1
    Membre très actif
    Inscrit en
    Septembre 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 246
    Par défaut Python list, incompréhension
    bonjour

    je suis face à truc basique, mais je ne parviens pas à comprendre, merci pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        li = []
        la= ['d', 'e', 'f']
        for i in range(4):
            li.append(la)
     
        li[1][1] = 'B'    
        print li
    Résultat attendu pour 'moi est : [['d', 'e', 'f'], ['d', 'B', 'f'], ['d', 'e', 'f'], ['d', 'e', 'f'], ['d', 'e', 'f']]

    mais j'obtiens : [['d', 'B', 'f'], ['d', 'B', 'f'], ['d', 'B', 'f'], ['d', 'B', 'f'], ['d', 'B', 'f']]

    je ne comprend pas
    get

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Par défaut
    pour "casser" les liens vers la même référence, il faut faire une "deepcopy" en utilisant:

    copy.deepcopy

    https://docs.python.org/2/library/co...#copy.deepcopy

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 25
    Par défaut
    Voici une explication
    Source : commentcamarche

    En Python 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import copy
     
    li = []
    la= ['d', 'e', 'f']
    for i in range(4):
        li.append(copy.deepcopy(la))
     
    li[1][1] = 'B'    
    print li

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    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 696
    Par défaut
    Salut,

    Utiliser deepcopy dans ce cas est quand même un peu exagéré. Une copy simple fait aussi bien l'affaire, d'autant que les objets de la liste à dupliquer sont non-mutables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> li = []
    >>> la = list('abc')
    >>> for i in range(3): li.append(la[:])
    ...
    >>> li
    [['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
    >>> li[1][1] = 0
    >>> li
    [['a', 'b', 'c'], ['a', 0, 'c'], ['a', 'b', 'c']]
    >>>
    Récupérer une copie de la liste se fait via liste[:] ou list(liste).
    La seconde écriture disant plus explicitement: "fabrique une nouvelle liste à partir des éléments de la liste passée..."

    Pour la petite histoire, si on écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> l1 = [1, 2, 3]
    >>> l2 = l1
    l1 et l2 sont des références vers le même objet "liste".
    Normal que lorsqu'on change le contenu de "l1":
    la différence soit aussi visible lorsqu'on accède à cet objet via l2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> l2
    ['a', 2, 3]
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Erreur Python : list index out of range
    Par mmmppp dans le forum Général Python
    Réponses: 4
    Dernier message: 15/10/2011, 21h59
  2. algo python liste
    Par ekremyilmaz dans le forum Général Python
    Réponses: 11
    Dernier message: 02/02/2009, 22h53
  3. segfault sur une boost::python::list
    Par psycofdj dans le forum Boost
    Réponses: 1
    Dernier message: 15/10/2008, 00h41

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