Comportement d'une boucle sur un tableau modifié dans la boucle - Python - Programmation
Marsh Posté le 15-10-2007 à 21:49:02
On modifie pas un tableau quand on itère dessus via un iterator en python.
Jamais.
Si tu veux filtrer, tu utilises soit filter soir une list comprehension soit une génération manuelle de liste de sortie (à base de for et de list.append):
Code :
|
Citation : Il semble qu'à chaque itération de la boucle, le tableau est réévalué dans son intégralité. Donc à la seconde itération c vaut le 2° élément du tableau actuel soit 'e'. Et à la 3°, il vaut le 3° élément soit 'r'. Et comme cette lettre est supprimée, le nombre d'éléments passe à 3 et comme j'ai atteint la 3° itération Python considère que j'ai traité tout mon tableau. C'est ça ??? |
En gros, Python génère un iterator qui garde simplement un index sur l'élément courant du tableau, sans rien faire d'autre.
En décomposé, si on appelle cet index caché __index__:
Code :
|
Marsh Posté le 15-10-2007 à 22:39:43
masklinn a écrit : Si tu veux filtrer, tu utilises soit filter soir une list comprehension soit une génération manuelle de liste de sortie (à base de for et de list.append):
|
Oui, j'ai effectivement pensé à créer une 2° liste contenant mes éléments à supprimer puis en itérant cette liste et en appelant tab.remove(). Mais quelque part ça me gêne de devoir dupliquer mon tableau pour le remover. Ca peut pas marcher si je crée un indice perso qui n'évolue que quand il faut style
Code :
|
???
Marsh Posté le 15-10-2007 à 22:46:03
Sve@r a écrit : |
Mais de quoi tu parles
Sve@r a écrit : Mais quelque part ça me gêne de devoir dupliquer mon tableau pour le remover. Ca peut pas marcher si je crée un indice perso qui n'évolue que quand il faut style
|
T'arriveras sûrement à le faire marcher, mais c'est immonde et c'est pas comme ça que code un utilisateur de python
Marsh Posté le 16-10-2007 à 07:44:28
masklinn a écrit : |
Ben le tableau "out" est bien un second tableau qui contient les éléments de "tab" dont je ne veux pas (en fait, dans ton cas il contient les éléments que je veux mais c'est un détail).
Donc si je fais un "for c in out : tab.remove(c)" cela supprimera bien de "tab" les éléments que je voulais supprimer ? En tout cas c'est comme ça que j'ai vu ton exemple.
masklinn a écrit : |
Reçu. Je ferai pas comme ça.
masklinn a écrit : et c'est pas comme ça que code un utilisateur de python |
Ah ben jdébute et j'ai pas encore toutes les subtilités en tête
Marsh Posté le 16-10-2007 à 08:05:04
Sve@r a écrit : |
Heuu oui, mais vu que out contient les éléments que tu veux, tu peux surtout utiliser out directement tu sais
Marsh Posté le 16-10-2007 à 23:32:40
masklinn a écrit : |
Ben c'est un poil plus compliqué que ça. En fait, je suis en train de découvrir PyQt. Donc j'ai fait pour tester une appli PyQT avec un bouton qui lance une sous-fenêtre.
Code :
|
Ca marche bien... sauf que la sous-fenêtre, quoi qu'on fasse, reste toujours affichée au-dessus de la fenêtre principale.
J'en ai conclu que c'était peut-être parce que j'appelais la sous-fenêtre en lui passant la fenêtre principale comme parent. J'ai donc corrigé ça et mis "None" comme parent
Code :
|
Là, la fenêtre apparaît puis disparaît très vite. J'en ai conclu que la variable "dial" était libérée par le gc d'où la modif suivante
Code :
|
Là, c'est presque parfait sauf que si je lance deux ou plusieurs sous-fenêtres, la nouvelle remplace l'ancienne. Donc j'en suis venu à passer par un tableau (initialisé dans le constructeur)
Code :
|
Là, tout est ok. Sauf que si l'utilisateur ferme une des "n" sous-fenêtres ouvertes, ben elles sont juste fermées mais restent toujours allouées d'où mon idée, dans le slotAction() de commencer par balayer le tabDial et si sa propriété "setVisible()" est à False, cela signifie que la fenêtre a été soit fermée par le bouton soit par la croix et donc de supprimer ces fenêtres devenues inutiles via un tabDial.remove(). ce qui m'a amené au post initial de ce topic (et qui recroise aussi le topic où je cherchais à comprende le gc)...
Marsh Posté le 19-10-2007 à 21:35:08
Si les solutions de Masklinn conviennent pas pour ton problème, tu peux aussi passer par deux boucles :
Code :
|
... en gros.
Arpsè, j'y connais rien en PyQt, mais ton problème à l'air un peu bizarre quand même. Ya peut-être un problème ailleurs (mais bon, j'y connais rien )
Marsh Posté le 20-10-2007 à 22:09:28
multani a écrit : Si les solutions de Masklinn conviennent pas pour ton problème, tu peux aussi passer par deux boucles :
|
Oui, c'est ce que j'avais dit dans mon 2° post. Créer un 2° tableau contenant les valeurs à supprimer puis traiter ces valeurs via le premier tableau...
multani a écrit : Après, j'y connais rien en PyQt, mais ton problème à l'air un peu bizarre quand même. Ya peut-être un problème ailleurs (mais bon, j'y connais rien ) |
Ben moi aussi je débute avec Qt donc je tatonne un peu...
Marsh Posté le 15-10-2007 à 21:36:57
Salut à tous,
Je continue ma découverte de Python et évidemment chaque jour j'en découvre un peu plus.
Là, j'ai été confronté à un problème qui m'a bloqué pendant un quart d'heure avant que je ne comprenne d'où venait le bug. En fait, j'avais instancié une boucle sur un tableau pour en éliminer certains éléments et ma boucle n'éliminait pas les bons
Ex:
Il semble qu'à chaque itération de la boucle, le tableau est réévalué dans son intégralité. Donc à la seconde itération c vaut le 2° élément du tableau actuel soit 'e'. Et à la 3°, il vaut le 3° élément soit 'r'. Et comme cette lettre est supprimée, le nombre d'éléments passe à 3 et comme j'ai atteint la 3° itération Python considère que j'ai traité tout mon tableau. C'est ça ???
Message édité par Sve@r le 15-10-2007 à 21:41:16
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.