2013-06-02 3 views
1

У меня есть программа Python, которая генерирует поле звезд и заполняет эти звезды спутниками. В конце кода у меня есть несколько вложенных циклов для печати звезд и их спутников, чтобы я мог отлаживать генератор. Результат немного сбивает с толку. Я почти уверен, что мои звезды и спутники сформированы правильно, и проблема в петлях. EDIT: Похоже, я был неправ. Упс.Python: Вложенные циклы `for`

Это код:

for s in world.stars: 
    print s.name 
    for satellite in s.satellites: 
     print satellite.name 

world.stars список объектов Star, которые содержат списки спутниковых объектов. Для этого теста я сгенерировал три звезды с двумя спутниками.

Это выход:

D6 
    D6-0 
    D6-1 
    S11-0 
    S11-1 
    M19-0 
    M19-1 
    S11 
    D6-0 
    D6-1 
    S11-0 
    S11-1 
    M19-0 
    M19-1 
    M19 
    D6-0 
    D6-1 
    S11-0 
    S11-1 
    M19-0 
    M19-1 

D6 это имя звезды, и D6-0 это название спутника: спутник звезды D6. Вместо того, чтобы перечислять имя звезды, а затем ее планеты, он перечисляет все планеты под всеми названиями звезд. Кажется, что я не понимаю использование циклов for и как инициализируется каждая итерация. Может ли кто-нибудь объяснить мне, где я ошибаюсь, или связать меня с ресурсом, который мог бы?

БОНУС: В общем, есть ли лучший способ, чем for?

EDIT: Полный код! Огромная ...

class World(): 
    stars = [] 
    max_stars = 3 
    used_sat_names = [] 
    def __init__(self): 
     print 'World Created' 

    def genUniverse(self): 
     last_distance_from_earth = 0 
     for x in xrange(0, self.max_stars): 
      star = Star(last_distance_from_earth) 

      satellite_max = random.randint(0,5) 
      for s in xrange(0, 2): 
       last_distance_from_star = 0 
       satellite = Satellite(star.name, satellite_max, s) 
       star.satellites.append(satellite) 

      last_distance_from_earth = star.distance_from_earth  
      self.stars.append(star) 


class Star(object): 
    name = '' 
    distance_from_earth = 0 
    kind = '' 
    satellites = [] 

    def __init__(self, last_distance): 
     self.distance_from_earth = last_distance + random.randint(4,8) 
     star_kind_list = (
      ('Neutron', 3, 'N'), 
      ('Dwarf', 10, 'D'), 
      ('Small', 22, 'S'), 
      ('Medium', 30, 'M'), 
      ('Large', 20, 'L'), 
      ('Giant', 10, 'G'), 
      ('Supergiant', 5, 'S') 
     ) 

     kind_index = WeightedChoice(star_kind_list).nextIndex() 
     self.kind = star_kind_list[kind_index][0] 

     self.name = star_kind_list[kind_index][2] + '%i'%(self.distance_from_earth) 
     print 'Star called %s created!'%(self.name) 


class Satellite(object): 
    name = '' 
    star_name = '' 
    distance_from_star = 0 
    size = '' 
    kind = '' 
    moons = [] 

    def __init__(self, star_name, satellite_max, satellite_number): 
     self.star_name = star_name 

     self.name = '%s-%s'%(star_name, satellite_number) 

     satellite_size_list = (
      ('Dwarf', 10), 
      ('Small', 30), 
      ('Medium', 20), 
      ('Large', 20), 
      ('Giant', 20), 
     ) 

     self.size = WeightedChoice(satellite_size_list).next() 
     print '%s has a satellite called %s'%(self.star_name, self.name) 

world = World() 
world.genUniverse() 

for s in world.stars: 
    print s.name 
    for satellite in s.satellites: 
     print satellite.name 
+2

Вы должны использовать переменную класса 'сателлиты', а не переменные экземпляра. Можете ли вы показать нам код для своего класса? – Volatility

+1

По-моему, это выглядит следующим образом: Вы печатаете первый мир, после чего все ваши спутники распечатываются. Я думаю, что у вас возникла проблема с добавлением спутников в ваши миры, так что для каждого мира добавляются все спутники. Не могли бы вы распечатать полный список с помощью «print world.stars» – Pacnos

+0

@Pacnos. Из-за вашего предложения я сделал несколько более глубоких и утомительных выступов. Да, у каждой звезды есть все планеты, что для меня довольно ужасно. Я попытаюсь опубликовать остальную часть моего кода, но он довольно большой. Поэтому я не делал этого изначально. – Wookieguy

ответ

2

Проблема заключается в вашем Stars классе:

Линия satellites = [] создает класса переменную, что означает, что все экземпляры класса разделят это переменные. Поскольку спутники должны быть разными для каждой звезды, вам нужна переменная экземпляра - это позволит вам иметь другое значение для переменной для каждого экземпляра.

Вам необходимо поместить декларацию в __init__.

class Star(object): 
    # ... 
    def __init__(self, last_distance): 
     self.satellites = [] # this creates an instance variable 
     #... 

Я хотел бы сказать, что другие переменные класса, которые вы создаете (name, distance_from_earth и kind) должны быть переменные экземпляра, а также.

+0

Отлично! Я сделал тест, чтобы увидеть, были ли эти переменные экземпляра в начале этого проекта, что, очевидно, было ошибочным тестом, основанным на некоторых глупых предположениях. Теперь я знаю некоторые проблемы с моим другим noob-кодом. – Wookieguy

Смежные вопросы