Отчего возникает ошибка RuntimeError?

Я написал такой код на Python:

numbers = {1, 2, 3}
for item in numbers:
    numbers.remove(item)

Но при выполнении срабатывает исключение RuntimeError. Отчего это происходит?


Ответы (2 шт):

Автор решения: Stanislav Volodarskiy
$ python temp.py
Traceback (most recent call last):
  File "/home/sv/desk/stackoverflow/temp.py", line 2, in <module>
    for item in numbers:
RuntimeError: Set changed size during iteration

В сообщении об ошибке написано буквально:

Ошибка времени исполнения: размер множества изменился во время итерации.

Интерпретатор следит за тем чтобы вы не изменяли множество во время цикла for. Изменение множества может сломать цикл разными способами: будут пропущены какие-то элементы, или цикл закончится раньше, или некоторые элементы множества будут учтены в цикле несколько раз. Это нерешённая техническая проблема: если вы перебираете контейнер, его нельзя менять. Инженеры бьются с этим много лет и ничего хорошего не придумали.

Не меняйте множество из заголовка цикла for, создавайте новое.

→ Ссылка
Автор решения: CrazyElf

Так то достаточно скопировать исходное множество, но придётся израсходовать лишнюю память:

numbers = {1, 2, 3}
for item in numbers.copy():
    numbers.remove(item)

Но вообще нужно исходить из проблемы, которую вы изначально решаете. Например, если вам нужно перебрать все элементы множества и те, которые уже перебрали, удалять, то лучше всего так:

numbers = {1, 2, 3}
while numbers:
    print(numbers.pop())

Если же вам просто нужно почистить множество не глядя, то:

numbers = set()
# или
numbers.clear()
→ Ссылка