2013-10-04 3 views
0

저는 파이썬에서 루프 반복 계산에 대한 간단한 질문을 가지고 있습니다. 나는 각 반복마다 "나이 드는"객체를 만들었지 만 특정 나이에 "죽는다"고 가정되는 객체를 만들었지 만, 때로는 상당히 오래 살기도합니다.루프 반복 계산 (Python)

def reproduce(): 
    class Offspring(Species): 
     def __init__(self,name,life,attack,move,location,status,species,age): 
      area = 1000 
      self.name = name 
      self.life = life 
      self.attack = attack 
      self.move = move 
      self.location = [random.randint(1,area),random.randint(1,area)] 
      self.status = 1 
      self.species = 'simple' 
      self.age = 1 
    for z in [y for y in petri_dish if y.status == 1 and y.life >= 50 and y.species == 'simple']: 
     petri_dish.append(Offspring('g' + str(turn/250)+'#'+str(z.name),(random.randint(int(z.life/2),z.life)),(random.randint(int(z.attack/2),z.attack)),(random.randint(int(z.move/2),z.move)),0,1,0,0)) 
     print 'g' + str(turn/250)+'#'+str(z.name), 'was born.' 
def move_around(): 
    for x in list(petri_dish): 
     x.age += 1 
     if x.status == 0 or (x.species == 'species' and x.age >= 750) or (x.species == 'predator' and x.age >= 3000): 
      print str(x.name) + ' expired. Cells left: ' + str(len(petri_dish))    
      petri_dish.remove(x) 
     else: 
      x.relocate() 
      x.target() 
      if len(petri_dish) >= 75: 
       for x in list(petri_dish): 
        if x.life < int(turn/25): 
         x.status = 0 
    if turn % 250 == 0: 
     reproduce() 

while len([y for y in petri_dish if y.status == 1]) > 1: 
    turn += 1  
    move_around() 

후손 클래스는 simple 종 및 연령 750 또는 이상 죽을 - 이상적으로 750 정확히, 그러나 그것은 문제의 일부 : 여기 내 프로그램의 코드 조각입니다. 개체 목록 (petri_dish)을 반복하는 방법을 알아 내지 못했고 반복의 어느 시점에서든지 status = 0 (죽었음)인지 또는 충분히 오래되었는지 여부에 관계없이 특정 개체를 제거합니다.

죄송하지만이 질문이 단순한 질문이지만 루프가 내게 적합하지 않은 경우 ... 필자는 독해력 등을 읽었지만 추가 자료는 인정 될 것입니다. 내 질문에 대한 답변은 말할 것도없고! 감사합니다.

+0

은 글로벌 변수를'turn'합니까? 또한 문제를 재현하는 데 필요한 최소한의 코드로 코드를 축소 할 수 있습니까? 현재 코드에서 관련 줄을 지적하지 않았습니다. –

+3

'x.species == 'species'와 x.age> = 750'을 테스트하고 있지만 클래스에''simple''로 설정되어있는 것 같습니다. 시험의이 부분은 항상 실패 할 것 같습니다. 부가 메모 : 일부 코드는 길어서 코드를 읽기가 어렵게 만듭니다. 또한 반복적으로 호출되는 함수에서 클래스를 작성합니다. 그 수업이 최상위 레벨에 살기를 원하지 않습니까? –

+0

감사합니다 스티븐! 그건 내 바보 같은 실수 였어. 코드를 수정하고 Offspring 클래스를 최상위 레벨로 이동해 보겠습니다. 엄청 고마워! – userNaN

답변

1

목록에 목록()을 전달할 때 목록 복사본이 반환됩니다 (http://docs.python.org/2/library/functions.html#list). 따라서 목록에서 x를 할 때 (petri_dish), 실제 목록이 아닌 목록 사본에서 요소를 가져옵니다.

내가 언급 한 이유는 for 루프의 첫 번째 코드 줄이 x.age + = 1이기 때문입니다. 이렇게하면 petri_dish 목록에있는 항목의 나이가 늘어나지 않습니다. 목록에서 항목을 제거하기위한 결정 요인으로 나이를 사용하기 때문에 문제가있는 것처럼 보입니다.

+0

걱정할 필요가 없습니다. 실제로 목록을 목록 이해로 바 꾸었습니다. y.species == 'simple'및 y.age <750) 또는 (y.species == 'predator'및 y.age <3000) 인 경우 petri_dish에서 y에 대한 y) ]' – userNaN

+2

루핑 문제가 해결 되었습니까? 또한 프로그램 전체에서 동일하게 유지되는 일부 변수 값 (예 : '단순'또는 '육식 동물'종의 이름, 사망 시간의 경우 750 및 3000)에 대한 상수를 작성하는 것이 좋습니다. simple_death_time = 750, predator_species_name = 'predator'와 같은 간단한 것들. 그것은 당신이 물건을 고치면 유지 관리가 훨씬 쉬워 질 것입니다. 도움을 청하기 위해 여기에 다시 게시해야한다면 다른 사람들이 코드를 읽는 것이 더 쉬울 것입니다. – Oniofchaos