2012-06-13 4 views
0

У меня есть фрагмент кода, который как-то терпит неудачу на следующей list.index функции:Python индекс список странное поведение

for line in flines: 
    for match in bad_data_regex.findall(line): 
     assert line in flines 
     index = flines.index(line) 
     flines.pop(index) 
     # other code that does not modify flines .... 

Мой код терпит неудачу на:

ScriptEngine.execute:Error in script Traceback (innermost last): 
    File "<string>", line 168, in ? 
ValueError: list.index(x): x not in list 

Если значение действительно не было в списке, я должен был получить AssertionError перед функцией list.index.

Я использую Jython 2.2.1 под Java версии 1.6.0_18.

Как это возможно?

EDIT:

Оказывается код, который генерировал эту ошибку не было то, что я писал выше. Мой интерпретатор Jython дал мне неправильный номер строки и оказался на линии с функцией индекса выше.

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

ответ

3

Это, вероятно, происходит из-за части flines.pop(index). Это всегда плохая идея, чтобы изменить список, пока вы перебираете его.

Рассмотрим следующий пример:

In [1]: a = range(5) 

In [2]: for i in a: 
    ...:  print a.pop() 
    ...: 
4 
3 
2 

In [3]: a 
Out[3]: [0, 1] 
+0

Спасибо за это. Оказывается, вышеприведенный код работает так, как предполагалось, но я буду воздерживаться от изменения того же списка, который я итерирую в будущем. –

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