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 :

problème liste de liste et zone mémoire


Sujet :

Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut problème liste de liste et zone mémoire
    bonjour,

    cela fait trois heures que j'essayai de comprendre pour quoi dans mon programme quand je modifiai une valeur dans une liste de liste toutes les autres valeurs qui ne me semblaient pas concernées changeaient de valeur aussi. Et puis je suis tombé là dessus au chapitre nommé :Comment créer une liste de listes de nombres (ou tableau à 2 dimensions) ?

    http://python.developpez.com/faq/?pa...stBaseFunction

    qui me dit que que chaque sous-liste pointe sur la même zone mémoire mais ne me dit pas comment je peux faire dans mon cas.

    Je travaille sur beaucoup de listes et certaines listes doivent copier leur contenu. Avec la façon dont je procède si j'essaye ensuite de modifier une valeur d'une sous liste toutes les sous listes sont aussi modifiées. Et cela me plait pas du tout.lol

    Voilà un exemple de comment je procède:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    k=[[0]]
     
    for i in range(10):
        k.append(k[i])
        k[i]
     
    >>> k
    [[0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
    >>> k[0][0]=2
    >>> k
    [[2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2]]
    Si vous pouvez arranger le problème sur le code au-dessus je pourrais déboguer mon code(que je n'ai pas mis car pas assez explicite pour un exemple).

    Merci d'avance.

  2. #2
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Ils ont tous la même référence:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> L = [1,2,3]
    >>> K = L
    >>> id(L)
    135926764
    >>> id(K)
    135926764
    >>> id(L) == id(K)
    True
    Pour faire ce que tu veux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> k = [[0] for _ in xrange(10)]
    >>> k
    [[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
    >>> k[0][0] = 2
    >>> k
    [[2], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
    >>>

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    C'est vrai qu'avec mon exemple on peut comprendre comme ça, merci quand même(ça servira bien un jour). Mais c'est pas ça que j'attendais ou alors j'ai mal compris.

    C'est pas créer une liste de deux dimensions qui m'intéresse mais faire des 'append' de liste dans une autre liste sans qu'un changement dans l'une est des effets dans l'autre.

    Bon je met la fonction qui me pose problème tant pis pour la clarté(faut avouer que c'est pas très beau) :
    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
    18
    19
    20
    21
    22
    23
    24
    25
     
    #infos complémentaires:
    #t est une liste de 64 cases
    #joueur est une valeur(pas d'importance ici, sert juste pour la récurrence)
    #pion_mange est une liste de liste de la forme : [[35,42],[45,52],[2,11]]
    #solution est une valeur(0 à l'origine, puis autres par la suite. sert juste pour la récurrence)
     
    def gestion_resultat(t,joueur,pion_mange,solution):
     """Organise les résultats ,de la fonction recur_dame, /
    dans 'resultat_rafle' sous forme de listes. Tel que première valeur=pion mangeur et valeurs suivantes=pions mangés./
    Chaque liste terminée correspond a une des possibilités de rafle pour un pion donné """
        global resultat_rafle
     
        if len(pion_mange)>1:
     
            for i in range(len(pion_mange)-1):            
                resultat_rafle.append(resultat_rafle[solution])     # copie la liste initiale autant de foi qu'il y a de réponses dans pion_mange
     
            for f in range(len(pion_mange)-1):
     
                position=pion_mange[f][1]
                pion_pris=pion_mange[f][0]
                resultat_rafle[solution+f].append(pion_pris)      #rajoute à la fin de chaque liste précédemment créée la position d'un pion mangé correspondant
     
                recur_dame(t,position,joueur,solution+f) #recurence

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Pour copier un liste L, tu peux utiliser l'expression L[:].
    Donc le corps de ta première boucle devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    resultat_rafle.append(resultat_rafle[solution][:])
    Mais, comme tu dis, ce code est pas très beau

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Oh ! Merci, ça fonctionne très bien.

    Si le code n'est pas très beau c'est simplement qu'on m'a appris comme ça à l'école. On ne connait ni les classes, ni les objets, ni les règles de l'arts.Mais ça va venir.

    Merci encore.

    A+

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

Discussions similaires

  1. Regrouper une liste en liste de listes
    Par West01 dans le forum Prolog
    Réponses: 12
    Dernier message: 14/03/2008, 14h07
  2. Réponses: 12
    Dernier message: 02/04/2007, 16h17
  3. Réponses: 2
    Dernier message: 02/04/2007, 13h21
  4. Réponses: 4
    Dernier message: 07/07/2006, 09h00
  5. Problème de MAJ d'une zone de liste
    Par Jérémy VAUTIER dans le forum Access
    Réponses: 3
    Dernier message: 17/10/2005, 14h09

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