【问题标题】:How do you iterate over a list of class objects in Python你如何遍历 Python 中的类对象列表
【发布时间】:2018-11-26 20:26:27
【问题描述】:

我正在尝试遍历类对象/模块对象列表以检查冲突并引发此错误:

  File "C:/Users/travi/PycharmProjects/game/main.py", line 81, in <module>
if collision.collision1.is_collision(player.player1.vel, player.player1.x1, player.player1.x2, player.player1.y1, player.player1.y2, environmentVector[i].x1, environmentVector[i].x2, environmentVector[i].y1, environmentVector[i].y2):
TypeError: list indices must be integers or slices, not environment

这是代码(来自 main.py)

    for i in environmentVector:
        if collision.collision1.is_collision(player.player1.vel, player.player1.x1, player.player1.x2, player.player1.y1, player.player1.y2, environmentVector[i].x1, environmentVector[i].x2, environmentVector[i].y1, environmentVector[i].y2):
            print("collision")

环境.py:

import pygame

class environment():
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.x1 = x - 16
        self.x2 = x + 16
        self.y1 = y - 16
        self.y2 = y + 16

collision.py:

import pygame
import player
import enemy
import environment

class collision():
    def __init__(self):
        self.collision = False

    def is_collision(self, moveSpeed, x1, x2, y1, y2, X1, X2, Y1, Y2):
        if (((x2 + moveSpeed >= X1) and (x2 <= X2)) and (((y2 >= Y1) and (y2 <= Y2)) or ((y1 <= Y2) and (y1 >= Y1)))) or (((x1 - moveSpeed <= X2) and (x1 >= X1)) and (((y2 >= Y1) and (y2 <= Y2)) or ((y1 <= Y2) and (y1 >= Y1)))):
            return True
        else:
            return False

【问题讨论】:

  • environmentVector[i].x1 -> i.x1
  • Python 循环是 for-each 循环。在每次迭代中,i 是环境对象本身,而不是计数器。
  • 那是很多多余的(...)

标签: python loops iterator


【解决方案1】:

Python for 循环是“for-each”类型的循环,与 C 和其他一些语言中的传统 for 循环不同。在每次迭代中,循环变量(在您的情况下为i)是容器中的下一个元素。 假设vecstd::vector&lt;int&gt; 类型,这在C++ 中:

for (size_t i = 0; i != vec.size(); ++i){
    std::cout << vec[i] << std::endl;
}

大致相当于 Python 中的 this(lst 被假定为 list 对象):

for i in lst:
    print(i)

如您所见,i 是元素本身,而不是它的索引。

话虽如此,这就是你的 for 循环可以修复的方法:

for i in environmentVector:
    if collision.collision1.is_collision(player.player1.vel, player.player1.x1, player.player1.x2, player.player1.y1, player.player1.y2, i.x1, i.x2, i.y1, i.y2):
        print("collision")

请注意,我只用is 替换了environmentVector[i]s。

如果你绝对需要索引,你可以使用enumerate:
lst 再次被假定为 list 对象):

for indx, obj in enumerate(lst):
    print(indx, obj)

在这里,在每次迭代中,您都会获得分配给indx 的索引和分配给obj 的对象本身

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 2021-11-30
    • 2021-11-21
    • 2016-12-29
    • 1970-01-01
    • 2011-04-26
    • 2014-02-19
    • 2015-05-25
    • 2023-03-04
    相关资源
    最近更新 更多