2012-03-27 11 views
1

を解決しました。助けをいただきありがとうございますが、問題はリストが上書きされてスプライトグループに変換され、すべてのリスト操作が役に立たなくなっているようです。リストから参照されていないオブジェクトを削除する

私は最近Pythonでプログラミングを始めました(常にアラーム音を鳴らしています)ので、コード化された方法がやや怖いのであれば謝ります。この特定のプログラムはパイゲーム(「エンジン」が使用されています)をインポートします。

オブジェクト/スプライトを含むリストを作成しようとしています。これは私が達成したようですが、オブジェクトが特定のポインタを持っていない限り、このリストからオブジェクトを削除しても問題がなくなりました。

スプライトクラスは次のように構成されます。

class Point(pygame.sprite.Sprite): 
    def __init__(self,pos=(0,0)): 
     pygame.sprite.Sprite.__init__(self) 

     #Unimportant code 

     self.dead=False 
     print self 
     #This prints; "<Point sprite(in 0 groups)>" 

    def update(self): 
     if(self.dead): 
      #sprList_PointSet.remove(?) 
      pass 

オブジェクトとリストが作成されます。

sprList_PointSet=[] 
sprList_PointSet+=[Point((50,90))] 
sprList_PointSet+=[Point((65,110))] 
# ... 

print sprList_PointSet 
#This prints; [<Point sprite(in 0 groups)>, <Point sprite(in 0 groups)>, ...] 

それはもはや明らかなメモリー表示がない場合には.remove(X)を使用して、必要なときに、リストからインスタンスを削除しないための方法はありますか? /または/ではない場合、誰かがそのようなやり方をより良い方法をお勧めすることができます。

+0

'lst.remove(self)'を使うことができますが、クラス内のリストへの参照が必要です。 –

+0

@ NiklasB。 'sprList_PointSet'がグローバル変数であれば、彼はそれを設定しようとしない限り、それをうまく参照することができます。 – agf

+0

@agf:そうでなければ、より良いデザインになるだろう。 –

答えて

2

self削除したいオブジェクトを指し、これだけremove(self)

def update(self): 
    if self.dead: 
     try: 
      sprList_PointSet.remove(self) 
     except ValueError: 
      pass 

remove

mutable sequencesのために定義されており、 in the tutorialに記載されている:

Remove the first item from the list whose value is x. It is an error if there is no such item.

+0

残念ながら、これは私が最初に試したものでした。エラーを返します。 "ValueError:list.remove(x):xがリストにありません" – H3katonkheir

+0

@ H3katonkheirリストにないオブジェクトに対して 'update'が呼び出されています。あなたはエラーを処理する必要があります。 – agf

+0

オブジェクトはリストにあります。リストを印刷すると、そこに何かがあることが示されますが、良い参照は表示されません。それが示している; "<ポイントスプライト(0グループ内)>"オブジェクトごと。 – H3katonkheir

2

は、あなたができるようにweak referencesを使用することができます「重要」なものがそれ以上必要としないときは、インスタンスは消えます。

+0

優雅な解決策 – pylover

+0

なぜこのようなケースでこれが必要なのかわかりません。あなたは精緻化できますか? –

+0

ええ、この場合、リストからそれらを取り除いてガベージコレクションを許可しないようにすることが考えられます。彼は依然として 'weakref'でリストから無駄な参照を削除する必要があります。 – agf

関連する問題