Я видел решения и обходные пути, но не мог найти объяснения выбора, чтобы не изменять смены наборов во время итерации по ним. Можете ли вы помочь мне понять, почему это нормальноПочему я не могу изменить набор, который я повторяю?
In [1]: l = [1]
In [2]: for i in l:
l.append(2*i)
if len(l)>10:
break
In [3]: l
Out[3]: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
в то время как это не в порядке
In [4]: l = {1}
In [5]: for i in l:
l.add(2*i)
if len(l)>10:
break
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-5-b5bdff4a382b> in <module>()
----> 1 for i in l:
2 l.add(2*i)
3 if len(l)>10:
4 break
5
RuntimeError: Set changed size during iteration
Что плохого об изменении набора во время прохода?
Я знаю, что порядок в наборе не определен, поэтому next
может быть затруднен. Это причина?
Вы уверены, что порядок итераций в списках определен, а не просто «выпадает из реализации» и может измениться? – Elazar
@ Элазар: Да, я уверен. Списки имеют определенный порядок. Даже если вы вставили или удалили элементы, порядок все еще четко определен из одной манипуляции к следующей. –