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

  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 683
    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 683
    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 683
    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 683
    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

  8. #8
    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
    Citation Envoyé par Clodion Voir le message
    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
    Oui effectivement je souhaite instancier un nouvel objet Cellule dans le tableau en fonction de la taille passée en paramètre.
    Citation Envoyé par Clodion Voir le message
    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
    J'avoue que cet algo semble un poil curieux, mais en fait je dois créer une liste dynamique donc ne pas utiliser les listes qui existent déjà en python ou autre langage orienté objet.
    Donc je dois rester le plus procédurale possible, cependant il semble que pour créer des tableaux (ou listes) d'objets je n'ai guère le choix de passer par .append(). Comme suggéré par Clodion.

    On avait le choix du langage objet j'ai opté pour Python car je désire me rapprocher de ce langage objet pour de futurs projets.

    L'algo était donné, a nous ensuite de l'implémenter. Je vais regarder de plus près les curseurs car un passage me semble inutile.

    Merci pour vos réponses, au final je comprends donc que pour faire un tableau d'objet la solution que j'utilisais créait en fait 4 fois le même objet

  9. #9
    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
    Citation Envoyé par Clodion Voir le message
    Coucou…

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

    Clodion
    Oui la première Cellule est toujours à 0

  10. #10
    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
    Bonsoir,
    Citation Envoyé par ProcedureFail Voir le message
    Oui la première Cellule est toujours à 0
    De ce que j'ai pu en voir, elle n'est pas à zéro, mais à None.
    Idem pour les deux autres…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    …
    MyListe = Liste()
    MyListe.inserer(8)
    MyListe.avancer()
    MyListe.inserer(9)
    MyListe.avancer()
    MyListe.inserer(10)
    MyListe.afficheListe()

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