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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Février 2020
    Messages : 8
    Par défaut Copie de Liste
    Bonjour à tous,

    J'ai un petit soucis, pour un exercice je dois faire une copie de liste afin que chacune des listes deviennent indépendantes (la modification de l'une ne modifie pas l'autre).
    J'utilise donc L2=list(L1).
    Ici L2 devient une copie indépendante de L1.

    Ceci marche lorsque L1 = [1, 2, 3, 4, 5].
    Dans ce cas L2 = [1, 2, 3, 4, 5],
    si je modifie L2, L2[3] = 6 j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    L2 = [1, 2, 3, 6, 5]
    L1 = [1, 2, 3, 4, 5]
    En revanche lorsque que L1 est une liste de liste par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L1 = [[1, 2, 3], [4,5,6], [7,8,9]]
    si je fais exactement la même opération et que je copie L1 : L2=liste(L1),
    si je modifie L2, L2[0][2] = 6 j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    L2=[[1, 2, 6], [4,5,6], [7,8,9]]
    L1 = [[1, 2, 6], [4,5,6], [7,8,9]]
    Ici L1 a été aussi modifié alors qu'elle ne devrait pas. Je ne comprends pas.
    J’espère que vous avez compris ce que je veux dire.

    Je suis disponible pour toutes questions. Merci

    Fliiwyk

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour faire une copie indépendante d'une liste de listes, on utilise "deepcopy" du module "copy".

    Voir ici la syntaxe et les explications: https://docs.python.org/3/library/co...#copy.deepcopy

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Février 2020
    Messages : 8
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Pour faire une copie indépendante d'une liste de listes, on utilise "deepcopy" du module "copy".

    Voir ici la syntaxe et les explications: https://docs.python.org/3/library/co...#copy.deepcopy
    Merci je vais me renseigner en utilisant cela

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Fliiwyk Voir le message
    Ici L1 a été aussi modifié alors qu'elle ne devrait pas. Je ne comprends pas.
    Ce n'est pas tout à fait L1 qui a été modifié, mais la sous-liste L1[0].

    Il faut voir une liste comme une référence (ou si tu connais le C, comme une adresse). Et il faut aussi savoir que Python essaye toujours d'aller à l'économie car dans 99% du temps, ça suffit pour que ça marche.
    Et donc avec des listes simples, si tu écris par exemple L2=L1, tu ne copies que l'adresse de L2 dans L1 tandis qu'en mémoire il n'y a qu'une seule et unique liste. Ca tu l'as bien compris et c'est pour ça que si tu as besoin de créer une vraie copie de L1 tu utilises le constructeur de listes à chaud L2=list(L1) (tu peux aussi utiliser le slice L2=L1[:]).

    Mais quand L1 contient des sous-listes, le mécanisme recommence un niveau en dessous. L1 ne contient que des adresses des sous-listes. Et donc en écrivant L2=list(L1) tu copies les adresses de L1 dans L2 mais ces adresses, elles, restent uniques. Donc si par exemple L1 contient [0x10, 0x20, 0x30], L2 sera peut-être créée ailleurs en mémoire mais contiendra quand-même [0x10, 0x20, 0x30]. Et en modifiant L1[0][0], tu modifies donc la liste unique contenue à l'adresse 0x10.
    Il te faut donc utiliser le même mécanisme mais sur 2 niveaux en écrivant par exemple L2=list(list(x) for x in L1).
    Et si les sous-listes de L1 contiennent elles-mêmes des listes (3D donc), il te faut alors recommencer le même mécanisme mais cette fois en 3D. Et etc etc etc.

    D'où le module "copy" mentionné par tyrtamos qui contient une fonction "deepcopy" laquelle fera ce travail quelle que soit la profondeur des listes à copier.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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