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 :

un print étrange ..


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Par défaut un print étrange ..
    Bonjour,

    Je fais une implémentation de liste statique et je suis confronté à un étrange problème, n'arrivant pas à le rectifier malgré plusieurs tentative de debugg, je laisse d'autres yeux voir ce que je n'aurais pas vu.

    En gros un tableau (ou liste) d'objet (Cellule) est créé et j'ajoute avec la méthode insererListe le data dans l'objet. Mais si je cré une liste de taille 4 par exemple initialisé normalement à None (voir objet Cellule), si j'insère une seul donnée et que je fais ensuite un print de la liste logiquement je devrais recevoir en sortie une seule valeur or il affiche 4 fois les memes valeurs

    pour l'objet Cellule
    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
     
    class Cellule:
     
    	def __init__(self):
    		self.__next = -2
    		self.__data= None
     
     
    	def GetData(self):
    		return self.__data
    	def GetSuivant(self):
    		return self.__next
    	def SetData(self,Obj):
    		self.__data = Obj
    	def SetSuivant(self, n):
    		self.__next= n
    pour l'objet liste

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    from Cellule import Cellule
     
    class Liste:
     
    	def __init__ (self,t=3):
    		self.taille= t+1
    		self.tete = 0
    		self.tab = [Cellule()]*(self.taille)
    		self.tab[0].SetSuivant(-1)
    		self.curseur = 0
     
    	def getCurseur(self):
    		return self.tab[self.curseur].GetSuivant()
     
    	def allerAuDebut(self):
    		self.curseur = self.tete
     
    	def voir(self):
    		if (self.getCurseur() != -1):
    			return self.tab[self.getCurseur()].GetData()
    		else:
    			return None
     
    	def avancer(self):
    		if (self.getCurseur() != -1):
    			self.curseur = self.tab[self.curseur].GetSuivant()
    			return True
    		else:
    			return False
     
    	def inserer (self, Obj):
    		i= 0
    		while ((i< self.taille) and (self.tab[i].GetSuivant() !=-2)):
    			i=i+1
    			if i == self.taille:
    				return False
    			else:
    				self.tab[i].SetData(Obj)
    				self.tab[i].SetData(Obj)
    				self.tab[i].SetSuivant(self.avancer())
    				self.tab[self.curseur].SetSuivant(i)
    				return True
     
    	def supprimer(self):
    		if (self.getCurseur() !=-1):
    			self.n = self.getCurseur()
    			self.tab[self.curseur].SetSuivant(self.tab[self.n].GetSuivant())
    			self.tab[self.n].SetSuivant = -2
    			return True
    		else:
    			return False
     
    	def afficheListe(self):
    		for i in range(self.taille):
    			print self.tab[i].GetData()
    et le fichier d'appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from Liste import Liste
     
    MyListe = Liste()
    MyListe.inserer(8)
    MyListe.afficheListe()
    enfin le résultat dans le terminal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Trashy:~ Trashy$ python /python/main.py
    8
    8
    8
    8

  2. #2
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> class Liste:
    	def marq(self, val):
    		self.a=val
     
     
    >>> a=[Liste()]*4
    >>> a
    [<__main__.Liste object at 0x7f7a5dec9150>, <__main__.Liste object at 0x7f7a5dec9150>, <__main__.Liste object at 0x7f7a5dec9150>, <__main__.Liste object at 0x7f7a5dec9150>]
    De même que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> b=[1]*4
    >>> b
    [1, 1, 1, 1]
    >>> for i in range(4):
    	print(id(b[i]))
     
     
    9715680
    9715680
    9715680
    9715680
    Ici, c'est quatre fois la même chose qui est répétée…
    (Le tab contient quatre référence à la même chose).
    Sinon, j'ai un peu de mal à suivre. :-D

    Clodion

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Si MyListe.insérer(8) effectue self.tab[i].SetData(8) pour tous les éléments de la liste. Ça produit une liste avec des éléments "identiques".
    Si ce n'est pas ce que vous vouliez, pourquoi le coder?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Coucou,
    En gros, remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.tab = [Cellule()]*(self.taille)
    par une boucle ou une liste par intention…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.tab=[]
    for k in range(self.taille):
    	self.tab.append(Cellule())
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.tab=[Cellule() for i in range(self.taille)]
    Voilà, cela devrait fonctionner…

    Clodion

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    A mon avis, il faut appliquer les deux modifications.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Coucou,

    Je pense qu'il y a un return qui évite le parcours des 4 cellules de la liste (avec un "pointeur" sur la prochaine à remplir)… Mais je puis me tromper!

    Clodion

  7. #7
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Coucou…
    Parmi les choses que j'ai du mal à saisir…
    Lignes 39 et 40
    Ligne 34 (Quelle utilité d'un while lorsqu'un if suffit)?

    Sinon, l'utilisation du "curseur" et du i…


    (En gros, ici, de ce que j'en ai compris, seule la deuxième cellule est modifiée à chaque fois!!… Mais bon…)

    Clodion

Discussions similaires

  1. Le résultat de Print ne s'affiche pas...
    Par Red Bull dans le forum Langage
    Réponses: 9
    Dernier message: 15/06/2006, 18h56
  2. [langage] print %d
    Par kacedda dans le forum Langage
    Réponses: 7
    Dernier message: 28/04/2003, 10h12
  3. Print et Preview d'un rapport Rave
    Par joebarthib dans le forum Rave
    Réponses: 4
    Dernier message: 19/12/2002, 14h46
  4. [CR] Print Engine error text
    Par afaraji dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 03/09/2002, 15h44
  5. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26

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