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


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut Copie de liste
    Bonjour à tous,

    Il semblerait que je bloque sur un truc vraiment basique

    je souhaite copier une liste et modifier cette copie, cependant cela modifie aussi l'originale.. Je ne comprends pas ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    N=[i for i in range (0,3)]
     
    c=[]
    for j in N :
        c.append([i for i in N])
    print(c)
     
    t=c
     
    for i in range (len(t)):
        for j in range (len(t[i])):
            t[i][j]=0.9*t[i][j]
    Bonne journée à tous,

    Stabilo.

  2. #2
    Membre régulier
    Homme Profil pro
    Data Lover
    Inscrit en
    Décembre 2014
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Data Lover
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 96
    Points : 101
    Points
    101
    Par défaut
    Salut,

    Il n'y aurait-il pas une erreur dans cette partie du code car "j" n'a pas été utilisé dans "append" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for j in N :
        c.append([i for i in N])
    Je pense que ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for j in N :
        c.append(j)

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Salut,

    Alors non je ne pense pas que le problème vienne de là.
    Ce n'est pas parce qu'un indice n'est pas utilisé qu'il ne sert à rien

    As tu testé ta solution ? Ou même mon programme ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for j in N :
        c.append([i for i in N])
    Je t'explique, ici je souhaite faire une liste de liste, un peu à l'image d'une matrice N*N. Le j est le nombre de lignes et le i le nombre de colonnes.

    Tant dis ce que t'as solution ne fait qu'une liste de N éléments. De plus le transfère de copie est toujours présent.

    Je sais qu'il serait plus simple de le faire et de régler mon problème avec la librairie numpy, mais je voulais quand même savoir pourquoi ça ne fonctionnait pas comme cela.

    Merci quand même

    Stabilo.

  4. #4
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    Pour cloner-copier une list : new_list = old_list.copy()

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  5. #5
    Membre régulier
    Homme Profil pro
    Data Lover
    Inscrit en
    Décembre 2014
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Data Lover
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 96
    Points : 101
    Points
    101
    Par défaut
    Ah oui, je vois. Je n'avais donc pas bien compris. Dans ton cas, "j" te permettait juste de récupérer les valeurs que tu as utilisé après. Désolé

    Par contre, j'ai testé ton code, je ne vois pas vraiment où la liste ta liste de départ est modifiée. Car avant ou après l'exécution de ton code, ta liste "N" a toujours les mêmes valeurs. C'est ça que je ne comprends pas.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Salut,

    Alors j'obtiens le même résultat avec copy()

    on dirait vraiment que python stock les listes dans la même mémoire et ne les différencie plus.

    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
    N=[i for i in range (0,3)]
     
    c=[]
    for j in N :
        c.append([i for i in N])
    print(c)
     
    t=c.copy()
     
    for i in range (len(c)):
        for j in range (len(c[i])):
            t[i][j]=0.9*c[i][j]
     
    print(c)
    print(t)
    EDIT : Pour être plus clair, c est la liste originale que je copie mais c'est t que je souhaite modifier.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    t = c ne copie pas la liste mais assigne la même référence au même objet.
    Et comme votre objet n'est pas une liste de listes, .copy ne suffira pas: il faudra utiliser copy.deepcopy.

    Ceci dit, plutôt que de créer une nouvelle liste puis la modifier, autant construire la nouvelle liste modifiée à partir de la première. Et si vous voulez faire du calcul numérique sur des tableaux comme 0.9 * T vous avez des bibliothèques comme numpy qui font cela très bien.

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

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Salut Wiztricks,

    Alors oui en effet je savais que numpy faisait parfaitement ce genre de boulot, je voulais juste avoir une réponse de pourquoi ça marchait comme ça.

    C'est quand même étrange que python prenne la même référence d'objet pour une liste mais pas pour un int par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A=2
    B=A
    B=2*B
    print(A,B)
    Sinon, comme vous le dites, il suffit de la créer en même 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
    N=[i for i in range (0,3)]
     
    c=[]
    for j in N :
        c.append([i for i in N])
    print(c)
     
    t=[]
    for i in range (len(c)):
        t.append([])
        for j in range (len(c[i])):
            t[i].append(0.9*c[i][j])
     
    print(c)
    print(t)
    Merci en tout cas,

    Stabilo.

  9. #9
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Les int sont un types non-mutable. Comme les floatants, les string ou les tuples. Et par non mutable, ça veut bien dire que vous ne pouvez pas modifier l'élément.
    Une liste elle est un type mutable.

    Si on fait a=b, alors là 2 cas de figure : si b est non-mutable, alors a est une copie de b; si b est mutable alors a est une nouvelle référence à l'élément b (un alias). Donc dans les cas de non mutable ca ne vous fait pas une copie.

    Comme l'a dit Wiztricks, il faut passer par copy.deepcopy, pour copier réellement une variable mutable.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Si on fait a=b, alors là 2 cas de figure : si b est non-mutable, alors a est une copie de b; si b est mutable alors a est une nouvelle référence à l'élément b (un alias). Donc dans les cas de non mutable ca ne vous fait pas une copie.
    Ah si c'était si simple...

    a = b assigne toujours la nouvelle référence a à l'objet "référencé" par b.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> b = 1
    >>> a = b
    >>> id(a)
    8791522395808
    >>> id(b)
    8791522395808
    >>>
    "mutable" arrive lorsqu'on modifie l'objet.
    Si l'objet n'est pas mutable, l'opération va créer un nouvel objet (différent) alors que sinon l'objet sera modifié (sans devoir en créer un autre).

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

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Tout est beaucoup plus clair merci à vous,

    Stabilo.

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

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