Problème en python
gomul
-
sebsauvage Messages postés 33415 Statut Modérateur -
sebsauvage Messages postés 33415 Statut Modérateur -
Bon jour!
ca fait qq semaines q j'essaie de faire tours d'hanoi en python mais g tjs des problèmes, ( normal mais cette fois c pas normal )
en fait ici il s'agit d'1 bleme au niveau de la fonction transferer ds la classe clTour, qd je fais appel a la fontion append
"vers_tour.disques.append(self.sommet())" elle me met c qui est renvoyé par self.sommet() ds toutes les autres cases de ma liste, comment résoudre le problème pour qu'elle mette juste c ki est renvoyé par sommet() ds la cases de destination ou vers_tour ?
Merci
ca fait qq semaines q j'essaie de faire tours d'hanoi en python mais g tjs des problèmes, ( normal mais cette fois c pas normal )
en fait ici il s'agit d'1 bleme au niveau de la fonction transferer ds la classe clTour, qd je fais appel a la fontion append
"vers_tour.disques.append(self.sommet())" elle me met c qui est renvoyé par self.sommet() ds toutes les autres cases de ma liste, comment résoudre le problème pour qu'elle mette juste c ki est renvoyé par sommet() ds la cases de destination ou vers_tour ?
Merci
class clTour : hauteur_max = 0 disques = [] def __init__ (self, hauteur) : self.hauteur_max = hauteur def remplir(self) : self.disques = range (1, self.hauteur_max+1) # range est une fonction spéciale de Python, elle retourne une # liste d'entiers compris entre le premier param et le dernier non compris self.disques.reverse() # trie la liste en ordre décroissant def sommet(self) : if ( len(self.disques) > 0 ) : return self.disques[-1] #return len(self.disques) else : return len(self.disques) def disque(self, etage) : if ( etage <= len(self.disques) ) : return self.disques[etage-1] else : return 0 def nbDisques(self) : return len(self.disques) def transferer(self, vers_tour) : if ( self.nbDisques() > 0 ) : if ( ( self.sommet() < vers_tour.sommet() ) or \ ( vers_tour.nbDisques() == 0 ) ) : vers_tour.disques.append(self.sommet()) # append ajoute l'objet passé par paramÚtre un fin de liste del self.disques[-1] # supprime le dernier élément de la liste else : print "Impossible d'empiler un disque sur un plus petit" else : print "Tour vide, rien à transférer" class clHanoi : tours = [] hauteur_max = 0 def __init__ ( self, hauteur) : self.hauteur_max=hauteur self.tours = [clTour(hauteur), clTour(hauteur), clTour(hauteur)] self.tours[0].remplir() def departValide(self, tour_depart) : if ( tour_depart < 0 or tour_depart > 2) : return 0 if ( self.tours[tour_depart].nbDisques() == 0 ) : return 0 return 1 def arriveeValide(self, tour_depart, tour_arrivee) : if ( not self.departValide(tour_depart) ) : return 0 if ( tour_arrivee < 0 or tour_arrivee > 2) : return 0 if ( self.tours[tour_arrivee].nbDisques() == 0 ) : return 1 if ( self.tours[tour_depart].sommet() >= self.tours[tour_arrivee].sommet() ) : return 0 return 1 def fini(self) : return ( self.tours[2].nbDisques == self.hauteur_max )
A voir également:
- Problème en python
- Citizen code python - Accueil - Outils
- Citizen code python solution - Forum Python
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
- Python par la pratique : 101 exercices corrigés pdf - Forum Python
- [PyCharm] Pas d'interpréteur python ✓ - Forum Python
2 réponses
Tu as déclaré ta classe tour comme:
Ce qui veut dire que les variables hauteur_max et disques sont des variables de classe: Elles sont partagées par tous les objets de type clTour.
Pour les déclarer comme variable d'instance, il faut les mettre dans le constructeur __init__():
Démonstration:
Variable de classe:
Cela affichera ["coucou"]: liste est partagé par c et b.
Variable d'instance:
Là, ça affichera [], car c et b on chacun leur liste.
class clTour : hauteur_max = 0 disques = []
Ce qui veut dire que les variables hauteur_max et disques sont des variables de classe: Elles sont partagées par tous les objets de type clTour.
Pour les déclarer comme variable d'instance, il faut les mettre dans le constructeur __init__():
self.hauteur_max = 0 self.disques = []
Démonstration:
Variable de classe:
class classeA:
liste = []
def __init__(self):
pass
c = classeA()
b = classeA()
c.liste.append("coucou")
print b.liste
Cela affichera ["coucou"]: liste est partagé par c et b.
Variable d'instance:
class classeB:
def __init__(self):
self.liste = []
c = classeB()
b = classeB()
c.liste.append("coucou")
print b.liste
Là, ça affichera [], car c et b on chacun leur liste.