Отчего возникает ошибка RuntimeError?
Я написал такой код на Python:
numbers = {1, 2, 3}
for item in numbers:
numbers.remove(item)
Но при выполнении срабатывает исключение RuntimeError. Отчего это происходит?
Ответы (2 шт):
$ 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, создавайте новое.
Так то достаточно скопировать исходное множество, но придётся израсходовать лишнюю память:
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()