Невозможно удалить экземпляры класса - PullRequest
2 голосов
/ 09 мая 2020

Я начинаю кодировать python и использую pyzero для создания простой игры. После окончания игры я хочу удалить все существующие экземпляры определенных типов классов, чтобы игра могла начаться снова. У меня есть список всех экземпляров этого класса, но использование remove (self), похоже, вызывает проблему в logi c, которую я не могу решить.

class Ball(Actor):
    ball_list = []

    def __init__(self, actor):               
        Actor.initiate_actor(self,"ball")
        Ball.ball_list.append(self)
        self.alive = True

    def kill(self):
        if self.alive:
            self.alive = False
            Ball.ball_list.remove(self) 


def new_game():
    global game_over, score

    for actor in Ball.ball_list:
        actor.kill()

    score = 0
    game_over = False


def draw():
    global game_over
    if game_over:
        screen.clear()
        screen.draw.text("Game Over", center = (WIDTH/2, HEIGHT/2), color = 'white')

    else:
        screen.clear()
        backdrop.draw()  
        for actor in Ball.ball_list:
            if actor.alive:
                actor.draw()

1 Ответ

0 голосов
/ 09 мая 2020

Фактически, вы удаляете объекты из списка, просматривая список. Прочтите Как удалить элементы из списка во время итерации? , для получения дополнительной информации об этом топе c.

Создайте мелкую копию списка (Ball.ball_list[:], см. Подробнее о списках ) и перебирать по копии списка, удаляя элементы из исходного списка:

def new_game():
    global game_over, score

    for actor in Ball.ball_list[:]:
        actor.kill()

    score = 0
    game_over = False

В любом случае, поскольку вы хотите удалить все элементы из списка, достаточно вызовите clear()

Ball.ball_list.clear()

или для удаления всех элементов (см. del)

del Ball.ball_list[:]

соответственно, чтобы создать новый и пустой список

Ball.ball_list = []

Обратите внимание: память объектов, которые не используются, освобождается сборкой мусора , поэтому достаточно удалить объект из (всех) списков. Кроме того, нет необходимости сбрасывать атрибуты объектов, которые будут уничтожены.

...