Проблема с break в for-цикле
Я перебираю список, который является инвентарем в моей игре. Каждый слот - тоже список, в который могут стаковаться одинаковые предметы. При выполнении функции, в которой добавляется предмет, происходит перебирание цикла, и если слот пустой, то в него просто добавляется предмет из обЪекта, с которого он взят (куст, дерево и т. п.). После этого я использую оператор 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.
В чем моя ошибка?
Ответы (1 шт):
Я сильно подозреваю, что изначально при создании inventory.slots вы делаете что-то подобное:
slots = [[]] * n
И в итоге у вас получается n раз ОДИН И ТОТ ЖЕ список, а не просто n одинаковых пустых списков. И когда вы делаете append одной из копий списка, это отражается и на остальных копиях.
Если это действительно так, то просто вместо этого создавайте inventory.slots вот так:
slots = [[] for _ in range(n)]
Тогда у вас создадуться n действительно независимых пустых списков, которые не будут влиять друг на друга.