2012-04-24 11 views
3

コードのこのセクションは、リストから(タプル)の「戦術」を削除していない理由を私は理解することはできません[タプルの()]タプルのリストからvar [0]に基づいてタプルを削除しようとしましたが、いくつかは残っていますか?

def _cleanup(self): 
    for tactic in self._currentTactics: 
     if tactic[0] == "Scouting": 
      if tactic[1] in self._estimate.currently_visible: 
       self._currentTactics.remove(tactic) 
     elif tactic[0] == "Blank": 
      self._currentTactics.remove(tactic) 
     elif tactic[0] == "Scout": 
      self._currentTactics.remove(tactic) 

私のIDEのスクリーンショット(PyDevは)さらに、デバッグ情報付きであります利用可能: http://imgur.com/a/rPVnl#0

編集:私が気づいた改善と改善。 明確にするため、「空白」が取り除かれ、必要に応じて「スカウト」が削除され、「スカウト」の戦術は削除されません。

+1

あなたが反復処理しているリストを変更している参照してください... [この記事](http://stackoverflow.com/q/1207406/589206)を参照してください。 – hochl

+0

変化するコレクションを反復する(特に要素が削除されたとき)ことはほとんどありません。通常、予期しない動作につながります。 – Fenikso

+0

'copy.copy(self._currentTactics)の中の戦術:'はすばやく修正されるかもしれません。 – Fenikso

答えて

3

反復処理中は、リストからメンバーを削除しています。これを行うと、リスト内の特定の要素が欠落します。代わりに、リストのコピーを反復処理する必要があります。

変更:

for tactic in self._currentTactics: 

に:

for tactic in self._currentTactics[:]: 
+0

リストスライスよりも明示的でわかりやすいため、 'copy.copy()'を優先します。 – Fenikso

+0

[:]はもっとうまく機能しています。私はまだキンクをたくさん持っていますが、まだ取り組んでいますが、これはすでに対処する方が簡単です。 @Feniksoがcopy.copy()によって何を意味するのかよく分かりません。 –

+0

@Vikram Saran - 助けてくれてうれしいです。 '[:]'と 'copy.copy()'も同じことをしますが、Feniksoは 'read 'なので' copy.copy() 'を好みます。 [:] '、(途中でリストスライスと呼ばれます)。 – fraxel

関連する問題