2016-06-23 4 views
1

Существует ли общее правило, согласно которому все модули следуют?Каковы правила аннулирования итератора?

In my case, я использую Python xml.etree library

Давайте говорить, что я это сделать:

for el in root.iter('*'): 
    for subel in el: 
     el.remove(subel) 

ли это сломать el итератор?

+0

no ... любой может реализовать свой собственный итератор, который делает что-либо действительно ... до тех пор, пока он возвращается, итерируется –

+2

Правило большого пальца «не изменяйте ничего, что вы итерации». Редко кто-то может предоставить явные правила аннулирования итератора на языке C++. – user2357112

+0

@mgilson yes oops. – Adrian

ответ

1

Существует множество случаев, когда изменение итерации при повторении по ней вызывает проблемы. Here's пример, когда итерация XML-дерева перепутана, когда элемент удален во время итерации. Есть много вопросов, на StackOverflow, где вы получите удивительные результаты при переборе по списку:

>>> lst = [1, 1, 2, 3] 
>>> for item in lst: 
...  if item == 1: 
...   lst.remove(item) 
... 
>>> print(lst) 
[1, 2, 3] 

(Обратите внимание, что есть еще в 1 в списке вывода).

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

>>> lst = [1, 1, 2, 3] 
>>> for item in reversed(lst): 
...  if item == 1: 
...   lst.remove(item) 
... 
>>> print(lst) 
[2, 3] 

Это связано с определенными гарантиями, которые производятся перечислить итератор. Обратите внимание, что из-за общего правила, перечисленного выше, я бы не советовал это делать (это, вероятно, заставит читателей кода поцарапать головы, чтобы попытаться выяснить, почему вы повторяете его назад).

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

Смежные вопросы