Какие контейнеры должным образом поддерживают мутацию во время итерации?
Например:
container = [1, 2, 3, 4]
for i in container:
print(i)
if i == 2:
container.append(8)
Выходные данные 1 2 3 4 8
(списки могут добавляться во время итерации).
Однако, если я заменим .append(8)
на .remove(1)
, на выходе будет 1 2 4
(т. Е. Элемент 3
будет пропущен). Кажется, что итерация списка заканчивается над индексами, а не элементами, и поэтому только последующие элементы списка (не предыдущие элементы списка) могут быть безопасно удалены во время итерации.
Есть ли в стандартной библиотеке какой-либо контейнер, который разрешает элементамбыть добавлены и удалены во время итерации, поведение которой:
- Новые элементы действительно повторяются (как для
list.append
), - Удаленные элементы не впоследствии get iterated,
- Независимо от того, будет ли элемент повторяться (или нет), никогда не будет зависеть от добавления / удаления других элементов.
У меня есть приложениеИмеется в виду реестр обратных вызовов событий. При срабатывании я бы хотел, чтобы обратные вызовы имели возможность охотно регистрировать или отменять регистрацию других обратных вызовов для того же события. (Если, например, я перебрал временную копию контейнера, мне нужно было бы подождать, пока событие не будет запущено во второй раз, прежде чем изменения вступят в силу.)