Votre principal problème est que vos listes existent dans plus d'un contexte (une autre méthode ou une autre fonction)
Lorsque vous enemies = []
vous désactivez la variable locale appelée « ennemis » - mais il cesse de pointer vers la objet précédent, qui est utilisé dans une autre méthode/méthode funtc (bien que vous n'ayez pas listé le code ici).
Votre autre approche, en utilisant for
essaie d'itérer sur une liste en la modifiant - elle devrait (et elle) se casse de façon inattendue.
Il suffit de faire:
enemies[:] = []
shots[:] = []
place: ceux-ci changeront l'objet actuellement référencé par ces noms, ne pas créer de nouveaux objets et de les utiliser localement. De cette façon, le contenu de n'importe quelle autre fonction qui utilise ces listes sera également vidé (ce n'est pas magique: la syntaxe tranche [:]
adresse tous les éléments de la liste - du premier au dernier, et l'attribution fait que ces éléments soient remplacé par le contenu de la liste vide: rien)
Bien que cela fonctionne pour l'instant, si vous utilisez des ennemis, des tirs et d'autres structures de données à travers plusieurs fonctions/méthodes, peut-être que vous auriez un design plus propre en utilisant un class
, en conservant toutes vos structures de données en tant qu'attributs de cette classe, et en faisant la promotion de vos fonctions sur les méthodes (même si, dans le cas contraire, vous ne faites pas actuellement d'autres utilisations d'un design orienté objet). De cette façon, il serait explicite que vous essayez de modifier les mêmes objets qui sont utilisés dans d'autres parties du code. Un autre conseil: lisez les docs, et familiarisez-vous avec les groupes (et Sprites) de pygame - ils sont très pratiques pour un design propre, et peuvent certainement faire mieux que tout ce que vous faites avec vos objets de liste au-dessus de (par exemple, si enemies
étaient un groupe, vous souhaitez simplement appeler enemies.empty()
dans ce cas)
duplication possible de [Comment vider une liste en Python?] (Http://stackoverflow.com/questions/1400608/how-to-empty-a-list-in-python) –
Lorsque vous faites des ennemis = [] 'et' shots = [] ', vous comptez sur le garbage collector pour supprimer toutes les anciennes instances pour vous. (c'est-à-dire que vous comptez sur les objets pour n'avoir aucune liaison, ce qui n'est pas nécessairement vrai!) La meilleure façon d'effacer une liste sans en créer une nouvelle est d'utiliser une affectation d'épissure: 'l [:] = []'. Alternativement: 'del l [:]'. – Shashank
@shashank: alors que votre solution proposée fonctionnerait, votre explication est incorrecte. Cela n'a rien à voir avec "le garbage collector n'avait pas encore atteint cet objet". – jsbueno