2012-04-24 1 views
3

나는 더 디버깅 정보를 내 IDE (를 PyDev)의튜플 목록에서 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) 

스크린 샷입니다 알아낼 수 없습니다 이용 가능 : 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

나는 list slice보다 더 명백하고 설명 적이기 때문에'copy.copy()'를 선호한다. – Fenikso

+0

[:]가 더 잘 작동합니다. 내가 꼬임을 많이 가지고 있지만 아직 해결 중이며 이미 처리하기가 훨씬 쉽습니다. @Fenikso가 copy.copy()를 통해 무엇을 의미하는지 모르겠습니다. –

+0

@Vikram Saran - 도움이 된 것을 기쁘게 생각합니다. '[:]'와'copy.copy()'도 똑같은 일을하지만 Fenikso는'읽기 쉽기 '때문에'copy.copy()'를 선호한다. 그래서' [:]', (이것은 목록 슬라이스라고 부릅니다). – fraxel

관련 문제