Проблема с break в for-цикле

Рейтинг: 0Ответов: 1Опубликовано: 01.06.2023

Я перебираю список, который является инвентарем в моей игре. Каждый слот - тоже список, в который могут стаковаться одинаковые предметы. При выполнении функции, в которой добавляется предмет, происходит перебирание цикла, и если слот пустой, то в него просто добавляется предмет из обЪекта, с которого он взят (куст, дерево и т. п.). После этого я использую оператор break.

    if pg.sprite.spritecollide(player, natural_objects, False):  # Сбор с природных обЪектов
        obj = pg.sprite.spritecollide(player, natural_objects, False)[0]

    if len(obj.items) > 0:          # Если обЪект не пустой
        for slot in inventory.slots:
            if len(slot) == 0:
                item = obj.items.pop(0)
                item.kill()
                slot.append(item)
                inventory.slot_alignment()  # Обновление позиций предметов, которые должны рисоваться
                print(inventory.slots.index(slot))
                break

По идее после первого попавшегося пустого слота, цикл должен завершиться, но если вывести содержимое инвентаря получим:

        for slot in inventory.slots:
            print(slot)

[<Item Sprite(in 0 groups)>]

[<Item Sprite(in 0 groups)>]

[<Item Sprite(in 0 groups)>]

...

Весь инвентарь заполняется одним предметом. Вот от куда вызывается функция сбора:

 if e.type == pg.KEYDOWN:
        if e.key == pg.K_e:

            # Добавление предметов в инвентарь
            collecting_item(inventory, player, natural_objects, drop_items)

Я использую pygame.

В чем моя ошибка?

Ответы

▲ 3Принят

Я сильно подозреваю, что изначально при создании inventory.slots вы делаете что-то подобное:

slots = [[]] * n

И в итоге у вас получается n раз ОДИН И ТОТ ЖЕ список, а не просто n одинаковых пустых списков. И когда вы делаете append одной из копий списка, это отражается и на остальных копиях.

Если это действительно так, то просто вместо этого создавайте inventory.slots вот так:

slots = [[] for _ in range(n)]

Тогда у вас создадуться n действительно независимых пустых списков, которые не будут влиять друг на друга.