【问题标题】:Having trouble using unnamed objects inside of for loop在 for 循环中使用未命名对象时遇到问题
【发布时间】:2013-10-02 22:20:09
【问题描述】:

代码来自一个程序,该程序使用 Python 和 Pygame 使球在屏幕上移动。所有的类和函数只处理数据操作,这里的主要类是Particle。所有实际的构造和函数调用都发生在这几行中:

number_of_particles = 10
my_particles = []
for n in range(number_of_particles):
    size = random.randint(20, 20)
    x = random.randint(size, width-size)
    y = random.randint(size, height-size)
    color = (100,0,100)
    particle = Particle(x, y, color, size)
    particle.speed = 1
    particle.angle = random.uniform(0, math.pi*2)
    my_particles.append(particle)

running = True
while running:
    screen.fill(background_color)
    for i, particle in enumerate(my_particles):
        particle.move()
        particle.getnumber()
        particle.bounce()
        for particle2 in my_particles[i+3:]:            
            collide(particle, particle2)
        particle.display()
pygame.display.flip()`

我知道该列表保存对象在内存中的位置,并且用于创建它们的 for 循环没有命名它们,但确实为它们提供了单独的参数。创建循环之后的功能循环遍历所有对象并更新它们的状态,碰撞函数发生在循环内部,循环遍历功能循环中未迭代的所有其他粒子。我不明白的是它是如何选择这些对象并引用它们而不显式调用它们的名称(这是不存在的)或它们的相对索引,因为有 10 个项目。这段代码实际上在这些循环中做了什么,最终在这些循环中做了什么?

【问题讨论】:

  • 第二个循环运行十次,列表中的每个项目运行一次。 for i, particle in enumerate(my_particles): 表示这十次中的每一次,它将列表中的不同项目分配给变量particle。这有意义吗?
  • 你是在问pythonfor 循环如何在没有索引的情况下工作?

标签: python list for-loop pygame nested


【解决方案1】:

for 循环将列表中的每个项目分配给变量particle2

这里的规范示例将每个值依次分配给变量item

items = ['a', 'b', 3]
for item in items:
    print item

【讨论】:

    【解决方案2】:

    在 Python 中,名称只是对象的句柄。您可以通过多种方式引用同一个对象,而不仅仅是使用其名称。

    【讨论】:

    • 好吧,更具体地说,如果我有十个对象,并且对象 6 与对象 3 发生碰撞,那么显示的代码实际上是将对象 6 分配给“粒子”,将对象 3 分配给“粒子 2”它们发生碰撞,因为每次通过循环时它们在内存中的位置都会被修改。我只是不确定这是怎么发生的。我知道它正在检查每个不是自身的粒子的碰撞,但我不确定它是如何做到这一点的......我也知道使这项工作的代码是(my_particles [i + 3:]),但我似乎无法概念化这种关系。
    • 外部 for 循环正在从列表 my_particles 创建一系列值 (index, particle),其中 index 只是向上计数 0...nparticles,particle 是您创建的对象并添加到之前位于列表中index 的列表中。在第二个 for 循环中,您实际上并没有将当前粒子与所有其他粒子进行比较。 [i+3:] 表示您正在将当前粒子与列表中比当前粒子晚至少 3 个索引的每个粒子进行比较。我不确定哪个部分难以概念化?
    • 我的印象是,正如您不止一次所说的那样,专注于“他们在记忆中的位置”会让自己感到困惑。这个概念在 Python 中并不是特别有用。您只是指列表中 particle 对象的不同实例。在collide() 函数中确定是否发生碰撞的神奇之处。
    【解决方案3】:

    for 循环/语句每个项目(依次),将其分配给您提供的变量名称,然后执行 suite。 for 语句仅适用于可迭代对象。 for 循环/语句不知道列表中的内容,它真的不在乎。我正在解释文档,也许看看它们会有所帮助 - The for statement

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多