Python:嵌套 `for` 循环

标签 python nested-loops

我有一个 Python 程序,可以生成一片恒星,并用卫星填充这些恒星。在代码的末尾,我有一些嵌套循环来打印星星及其卫星,以便我可以调试生成器。结果有点令人困惑。我几乎可以肯定我的星星和卫星是正确生成的,并且问题出在循环中。编辑:看来我错了。哎呀。

这是代码:

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 循环更好的方法?

编辑:完整代码!巨大...

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 = [] 行创建一个类变量,这意味着该类的所有实例将共享该变量。由于每颗恒星的卫星都应该不同,因此您需要一个实例变量 - 这将允许您为每个实例拥有不同的变量值。

您需要将声明放入__init__中。

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

我想说,您创建的其他类变量(namedistance_from_earthkind)也需要是实例变量.

关于Python:嵌套 `for` 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16879347/

相关文章:

C - 嵌套 for 循环不打印多个元素

php - MySQL 事件历史记录,查找上一行 5 分钟内的每一行,直到找不到行

python - 在 Python 3.6 中导入库 "modin"时出错

python - 更改标签之间的文本 - shell 脚本

python - 将 GDB 附加到 linux 中的垂死进程

python - AWS Boto 实例标记

python - 我怎样才能做到这一点,但骰子的数量是可变的?

java - 嵌套 for 循环以创建砖墙

python - matplotlib 示例代码抛出 TclError

php - 如何使用嵌套 do while 循环从数据库获取菜单和子菜单?