У меня есть программа 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
Вы должны использовать переменную класса 'сателлиты', а не переменные экземпляра. Можете ли вы показать нам код для своего класса? – Volatility
По-моему, это выглядит следующим образом: Вы печатаете первый мир, после чего все ваши спутники распечатываются. Я думаю, что у вас возникла проблема с добавлением спутников в ваши миры, так что для каждого мира добавляются все спутники. Не могли бы вы распечатать полный список с помощью «print world.stars» – Pacnos
@Pacnos. Из-за вашего предложения я сделал несколько более глубоких и утомительных выступов. Да, у каждой звезды есть все планеты, что для меня довольно ужасно. Я попытаюсь опубликовать остальную часть моего кода, но он довольно большой. Поэтому я не делал этого изначально. – Wookieguy