(edit: désolé pour l'espace d'inserrage de code qui te supprime toutes tes tabulations et indentations à chaque fois, il faut faire quelque chose, le corriger...)
Bonjour,
J'avais codé un programme récursif Tours de Hanoi qui imprime chaque étape (sous forme de listes) du jeu
(toutes les étapes de résolution les unes à la suite des autres)
# Tours de Hanoi
n = 3 # nombre de disques
depart = [ n-i for i in range(n)]
intermediaire = []
arrivee = []
tours = [depart, intermediaire, arrivee]
def deplacer(depart, arrivee) :
sommet_depart = 0
sommet_arrivee = 0
if len(tours[depart]) > 0 :
sommet_depart = tours[depart][len(tours[depart]) - 1]
if sommet_depart > sommet_arrivee and sommet_arrivee != 0 :
print("erreur : sommet", depart, " > sommet", arrivee) # règles du Jeu
else:
tours[depart].pop(len(tours[depart]) - 1)
tours[arrivee].append(sommet_depart)
print(tours)
Quand vous examinez ce code ci-dessus vous observez bien que la liste "space" se remplit au fur et à mesure de
l'incrémentation du compteur j, et ce avec des listes différentes les unes des autres.
Cependant si j'injecte le même processus dans le programme suivant :
n = 3
Depart = [ n - i for i in range(n)]
Intermediaire = []
Arrivee = []
Tours = [ Depart, Intermediaire, Arrivee]
Space = [ [[ n - i for i in range(n)], [], []] ]
Temp = [ [] for i in range(n**3)]
j = 0
def move(Depart, Arrivee):
sommet_D = 0
sommet_A = 0
if len(Tours[Depart]) > 0 :
sommet_D = Tours[Depart][len(Tours[Depart]) - 1]
if len(Tours[Arrivee]) > 0 :
sommet_A = Tours[Arrivee][len(Tours[Arrivee]) - 1]
if sommet_D > sommet_A and sommet_A != 0 :
print("Error")
else :
global j #on oublie pas le global
La ligne en cause est Temp[j] = Tours qui ne copie pas les valeurs de Tours mais créé une référence à Tours (une modification de Temp[j] affectera Tours et inversement).
Il faut faire une copie profonde (deepcopy) de Tours
Est-ce que utiliser le slicing [:] est équivalent à deepcopy? Pour la singularité, c'est peut-être que ton code est trop lourd. C'est devenu un trou noir.
Si j'ai une liste de listes, le slicing ne sera pas suffisant. Oui, Ça prend deepcopy
- Edité par PierrotLeFou 24 mars 2022 à 17:03:05
Le Tout est souvent plus grand que la somme de ses parties.
le slicing fait du shadow copy. En fait, avec le slicing (ou la fonction copy()) il n'y aurait pas de problème si la liste n'était pas composée de listes (ou plus généralement d'objets composés)
J'y ai pensé après car je me suis fait jouer un tour avec des listes de listes.
Le Tout est souvent plus grand que la somme de ses parties.
Je suis face à une singularité (listes python)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.