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 :

Valeurs écrasées à l'intérieur de ma liste


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut Valeurs écrasées à l'intérieur de ma liste
    Bonjour!!

    j'ai un comportement bizarre avec mes listes (bizarre = que je ne comprends pas..).
    Je créer une liste, je modifie ses valeurs cycliquement, et tout va bien.
    A côté de ça je stoque les valeurs du premier élément de ma liste avant le changement, pour une utilisation ultérieure. Tout va toujours très bien.
    Puis à un moment je fais un "insert" dans ma liste (et incrémente "int_Taille").
    Et là c'est le drame:
    Je stoque toujours mon premier élément, mais après modification des valeurs de ma liste, mon élément stoqué à aussi changé!!

    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
    26
    27
     
    #l'init de la liste
    self.tab_Positions = self.int_Taille.get()*[0]
    for i in range(self.int_Taille.get()):
        self.tab_Positions[i] = Coordonnees(self)
     
    #le changement des valeurs
    self.pos_Queue.int_PosX.set(self.tab_Positions[0].int_PosX.get())
    self.pos_Queue.int_PosY.set(self.tab_Positions[0].int_PosY.get()) 
     
    ## ici "pos_Queue" est bon
     
    for i in range(self.int_Taille.get()-1):
        self.tab_Positions[i].int_PosX.set(self.tab_Positions[i+1].int_PosX.get())
        self.tab_Positions[i].int_PosY.set(self.tab_Positions[i+1].int_PosY.get())
    #je vous épargne le nouveau self.tab_Positions[self.int_Taille.get()] parceque c'est un peu long et que mon probkème n'est pas là
     
    ## ici "pos_Queue" a changé et a pris la nouvelle valeur de "self.tab_Positions[0]" !!
     
    #mon type "coordonnées"
    class Coordonnees:
            def __init__(self, parent):
                    self.parent = parent
     
                    #Structure
                    self.int_PosX = Tkinter.IntVar()                 
                    self.int_PosY = Tkinter.IntVar()
    J'ai essayé plusieurs variantes, en utilisant des variables intermédiaires lors de la réactualisation de ma liste et de mon élément sauvegardé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ix = self.tab_Positions[i+1].int_PosY.get()
    iy = self.tab_Positions[i+1].int_PosX.get()
    self.tab_Positions[i].int_PosY.set(ix)                
    self.tab_Positions[i].int_PosX.set(iy)
    J'ai essayé de changer mon initialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.tab_Positions = []
    for i in range(self.int_Taille.get()):
        self.tab_Positions.append(Coordonnees(self))
    Mais rien n'a changé.
    Du coup je me disais que peut être ma liste non-contrainte n'était peut être pas si non-contrainte que ça et que de l'avoir agrandit j'avais la zone réservée en mémoire pour ma liste qui recouvrait celle de mon élément sauvegardé.
    C'est pas très convaiquant, mais j'ai pas mieux.

    Quelqu'un verrait une grosse (ou petite) boulette dans mon code?
    Ou a défaut, quelqu'un aurait-il une expliquation?
    Ou encore, quelqu'un pourrait-il m'expliquer comment Python gère ses listes dynamiquement en mémoire pour que j'essaye de comprendre ce qui peut bien m'arriver.

  2. #2
    Membre expérimenté Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut
    Petite précision, après insertion multiple de print.
    C'est bien quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    self.tab_Positions[i].int_PosX.set(self.tab_Positions[i+1].int_PosX.get())
    self.tab_Positions[i].int_PosY.set(self.tab_Positions[i+1].int_PosY.get())
    pour i = 0 que pos_Queue est modifié (que j'utilise ou pas des variables intermédiaires).
    De plus, si je modifie la valeur (l'habitude de gnat, le compilo ada, qui vire les variables qu'il juge inutile) genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    px = self.tab_Positions[i+1].int_PosX.get()
    px = px + 2
    self.pos_Queue.int_PosX.set(px)
     
    ## et de même dans la boucle for
    ça change rien, ce qui n'est pas illogique.
    mais ça m'avance pas non plus..

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut
    Je n'ai rien compris à ton problème lol Mais puisque tu travailles avec des objets, le problème ne viendrait des références ? C'est typique des données qui "se modifient" quand ne le souhaite pas.

  4. #4
    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,

    Petite manip amusante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    L=[1,2,3,4,5,6]
    R=L
    print R
    [1,2,3,4,5,6]
    L[2]=9
    print L,R
    [1, 2, 9, 4, 5, 6]  [1, 2, 9, 4, 5, 6]
    Cala veut dire que lorsque j'ai créé la nouvelle variable R par affectation à L, je n'ai pas créé de nouvelles valeurs: R continue à pointer sur la liste L!

    Parade simple:

    Après cela, une modification de L ne se répercute plus sur R.

    On peut faire aussi explicitement une copie, et même une copie profonde (deepcopy).

    Il y a quelques explications sur le tuto de Swinnen chapitre "10.2.10. Copie d'une liste" présent sur ce site: http://python.developpez.com/cours/T...apitre10#L10.2

    Tyrtamos

  5. #5
    Membre expérimenté Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut
    Oui mais normalement, je créé une liste vide puis j'y ajoute mes valeurs (pour éviter d'avoir x fois les mêmes coordonnées dans ma liste)

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #l'init de la liste
    self.tab_Positions = self.int_Taille.get()*[0]
    for i in range(self.int_Taille.get()):
        self.tab_Positions[i] = Coordonnees(self)

    Du coup -toujours normalement- chaque "Coordonnees" est différente.

    Après, je récupère des valeurs dans une autre coordonnees, a priori indépendante, déclarée ailleurs :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    self.pos_Queue = Coordonnees(self)

    Or pour moi les set() et les get() se contentent de renvoyer une valeur, extraite, pas du tout une adresse/référence, non?

    Sinon gslongo ta remarque m'intéresse.
    Tu peux développer (je vais chercher par ailleurs, rassurez vous)?

  6. #6
    Membre expérimenté Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut
    Alors effectivement, quand je modifie la taille de ma liste, self.pos_Queue et self.tab_Positions[0] pointe à la même adresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    self.pos_Queue        : __main__.Coordonnees instance at 0x00C40EB8
    self.tab_Positions[0] : __main__.Coordonnees instance at 0x00C40EB8
    self.tab_Positions[1] : __main__.Coordonnees instance at 0x00C43058
    alors que ce n'était pas lors des premiers cycles , avant que je ne modifie la taille de self.tab_Positions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    self.pos_Queue        : __main__.Coordonnees instance at 0x00C40EB8
    self.tab_Positions[0] : __main__.Coordonnees instance at 0x00C43058
    self.tab_Positions[1] : __main__.Coordonnees instance at 0x00C43120

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

Discussions similaires

  1. [XHTML] Valeur d'un élément d'une liste ordonnée
    Par Yogui dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 16/01/2007, 01h12
  2. [MySQL] Organiser les valeurs de 2 tables dans une liste de sélection
    Par domdas dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/08/2006, 08h51
  3. Réponses: 4
    Dernier message: 07/08/2006, 17h01
  4. Réponses: 4
    Dernier message: 30/06/2006, 16h18
  5. Réponses: 13
    Dernier message: 29/03/2006, 21h00

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