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 :

Copie de liste (débutant)


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Copie de liste (débutant)
    Bonjour
    j'ai quelques soucis avec la copie de tableaux.
    Je veux créer un tableau 10*2, puis changer toutes les valeurs de la 2eme entrée de chaque item
    Par exemple changer le tableau [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
    en [[0,2],[0,2]......]

    J'ai d'abord fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    tableau = [[0,0]]*10
     
    print(tableau)
    for item in tableau:
    	item[1] +=2
     
    print (tableau)
    Mais ça ajoute 2 dix fois à chaque deuxième composante, j'obtiens à la fin :

    [[0, 20], [0, 20], [0, 20], [0, 20], [0, 20], [0, 20], [0, 20], [0, 20], [0, 20], [0, 20]]


    J'ai essayé de copier le tableau dans un autre avec l'instruction tab2 =list(tableau), le test me dit bien que les 2 tableaux sont différents,
    mais agir sur le 2eme agit aussi sur le premier, je ne comprends pas pourquoi (de toute façon ça ne règle pas le problème initial non plus, mais j'aime non plus ne pas comprendre)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    tableau = [[0,0]]*10
     
    tab2=list(tableau)
     
    print(id(tableau)==id(tab2))
     
    print(tableau)
    for item in tab2:
    	item[1] +=2
     
    print (tableau)
    False
    [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
    [[0, 20], [0, 20], [0, 20], [0, 20], [0, 20], [0, 20], [0, 20], [0, 20], [0, 20], [0, 20]]

    J'ai la même chose en faisant
    for i in range(len(tab2)):

    tab2[i][1]+=2

  2. #2
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Normal : c'est un comportement lié à la copie de listes : elles ont la même référence.
    Voici une option :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tab = []
    for i in range(10):
        tab.append([0,0])
     
    print(tab)
    for item in tab:
    	item[1] +=2
     
    print (tab)
    Pas d'aide par mp.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Ok merci, ça règle mon problème de départ de création de tableau.

    Mais je ne comprends pas pourquoi agir sur tableau2 change tableau alors que le test
    id(tableau)==id(tab2) renvoie False, elles ont quand même la même référence ?

  4. #4
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    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
    tab = []
    for i in range(10):
        tab.append([0,0])
     
    print(tab)
    for item in tab:
    	item[1] +=2
     
    print (tab)
    for k in range(10):
        print(id(tab[k]),end = " - ")
     
    print()
    tableau=[[0,0]]*10
    print(tableau)
    for k in range(10):
        print(id(tableau[k]),end = " - ")
    Pas d'aide par mp.

  5. #5
    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
    Bonsoir,

    La variable d'une liste est en faite la référence d'un objet list qui lorsqu'on le passe en argument ou le duplique fera en fait appel à la même référence/objet en mémoire.

    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    l = [0, ]
     
    def add(mylist):
    	mylist.append(0)
     
    print(l) # [0]
    add(l)
    print(l) # [0, 0]
    Le fait de modifier le contenu d'un objet va appliquer la modification sur l'objet passé en argument, mylist reste une variable locale mais sa valeur (pointe) fait référence à l'objet l externe passé en argument.

    C'est d'ailleurs ce qui différencie l'usage d'un type list ou d'un tuple, l'un est mutable, le type list, qui autorise de modifier son contenu, l'autre le tuple est immutable.

    Par contre ça n'a rien à voir avec les pointeurs comme en C, si on remplace mylist par un autre objet cela ne va pas remplacer l'objet l/list d'origine.



    Pour permettre de copier une liste dans une nouvelle référence il faut créer un nouvel objet. Il suffit d'utiliser mylist.copy() ou le slicing/index mylist[:]

    Si l'objet contient aussi des listes il faut alors utiliser : copy.deepcopy(x)
    pour recréer de nouvelles références de chaque objet contenu dans la liste.

    La syntaxe suivante :

    Créer une liste, un seul objet qu'on duplique 10 fois, mais 10 fois la même référence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id(tableau[0]) == id(tableau[1]) # True
    tableau[0] is tableau[1] # True
    Le moyen de créer 10 objets différents est cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tableau = [[0,0] for x in range(10)]
     
    id(tableau[0]) == id(tableau[1]) # False
    tableau[0] is tableau[1] # False
    tableau[0][0] = 20
     
    print(tableau)
    # [[20, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
    Et pour votre deuxième problème il faut faire un deepcopy de tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import copy
    tableau = [[0,0] for x in range(10)]
     
    tab2=copy.deepcopy(tableau)
     
    print(id(tableau)==id(tab2))
     
    print(tableau)
    # [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
    for item in tab2:
    	item[1] +=2
     
    print (tableau)
    # [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]

Discussions similaires

  1. [VBA-EXCEL]Copie de listes nommées
    Par lucarno dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/07/2007, 23h51
  2. constructeur de copie (class Liste)
    Par crischprolch dans le forum C++
    Réponses: 7
    Dernier message: 11/05/2006, 15h59
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Copie de liste hétérogène
    Par jbat dans le forum Langage
    Réponses: 6
    Dernier message: 03/07/2004, 11h01
  5. Copie de Liste
    Par Arnaud-h dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/05/2004, 14h46

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