Python:嵌套的`for`循环

Python:嵌套的`for`循环,python,nested-loops,Python,Nested Loops,我有一个Python程序,可以生成一个恒星区域,并用卫星填充这些恒星。在代码的最后,我有一些嵌套的循环来打印星星和它们的卫星,这样我就可以调试生成器了。结果有点令人困惑。我几乎可以肯定,我的恒星和卫星是正确生成的,而问题就在循环中。编辑:看来我错了。哎呀 代码如下: for s in world.stars: print s.name for satellite in s.satellites: print satellite.name world.stars是

我有一个Python程序,可以生成一个恒星区域,并用卫星填充这些恒星。在代码的最后,我有一些嵌套的循环来打印星星和它们的卫星,这样我就可以调试生成器了。结果有点令人困惑。我几乎可以肯定,我的恒星和卫星是正确生成的,而问题就在循环中。编辑:看来我错了。哎呀

代码如下:

for s in world.stars:
    print s.name
    for satellite in s.satellites:
        print satellite.name
world.stars
是恒星对象列表,其中包含卫星对象列表。在这个测试中,我生成了三颗星星,每个星星有两颗卫星

这是输出:

    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星的卫星。它不是先列出一颗恒星的名字然后再列出它的行星,而是列出所有恒星名字下面的所有行星。似乎我不理解
对于
循环的用法,以及每个迭代是如何初始化的。有人能向我解释一下我错在哪里,或者把我和一个可能的资源联系起来吗

奖励:一般来说,对于循环,有没有比
更好的方法

编辑:完整代码!巨大的

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

问题出在您的
Stars
课程中:

satellites=[]
创建一个类变量,这意味着该类的所有实例都将共享该变量。因为每个恒星的卫星应该不同,所以您需要一个实例变量-这将允许您为每个实例的变量设置不同的值

您需要将声明放入
\uuuu init\uuuu

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

我想说,您创建的其他类变量(
name
distance\u from\u earth
、以及
kind
)也需要是实例变量。

您必须使用类变量
satellites
,而不是实例变量。你能给我们看看你班上的代码吗?我认为这看起来像是以下问题:你打印出第一世界,然后你所有的卫星都打印出来。我想你们在向你们的世界添加卫星时遇到了一个问题,所以在每个世界,所有的卫星都被添加了。你能试着用“print world.stars”@Pacnos打印出完整的列表吗?由于你的建议,我做了一些更深入和乏味的戳。是的,每颗恒星都有所有的行星,这对我来说非常可怕。我将尝试发布我的代码的其余部分,但它相当大。这就是我当初为什么不这么做的原因了。你可能知道了一些事情。主代码即将出现,尽管它可能是巨大的。@Wookieguy你只需要发布类,
world.stars
中的元素是实例(无论你如何命名)。太棒了!我做了一个测试,看看这些是否是本项目开始时的实例变量,这显然是一个基于一些愚蠢假设的错误测试。现在我知道了我的其他noob代码的一些问题。