зачем убирать элемент deque Fail? - PullRequest
0 голосов
/ 30 апреля 2018

Я запускаю код следующим образом:

q = deque([4,5,6,7,8])
for e in q:
    print("remove the {0}".format(e))
    q.remove(e)

Traceback (most recent call last):
  File "C:\Program Files\Python365\lib\site-packages\IPython\core\interactiveshell.py", line 2963, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-18-63a1d575cfeb>", line 1, in <module>
    for e in q:
RuntimeError: deque mutated during iteration
remove the 4

зачем вызывать ошибку RuntimeError?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы не можете изменить deque, перебирая его.

Типичный шаблон с очередями - вместо этого использовать цикл while и удалять элементы с нужного конца с помощью deque.pop() или deque.popleft().

например:.

>>> q = deque([4,5,6,7,8])
>>> while q:
...     element = q.pop()
...     print('removed {}'.format(element))
...
removed 8
removed 7
removed 6
removed 5
removed 4

или

>>> q = deque([4,5,6,7,8])
>>> while q:
...     element = q.popleft()
...     print('removed {}'.format(element))
...
removed 4
removed 5
removed 6
removed 7
removed 8
0 голосов
/ 30 апреля 2018

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

q = deque([4,5,6,7,8])
copy = list(q)

for e in copy:
    print("remove the {0}".format(e))
    q.remove(e)

Или, если вы хотите удалить все элементы сразу:

q.clear()
...