Как правило, плохая идея модифицировать список, по которому вы перебираете, могут произойти всевозможные странные вещи. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. Когда вы удаляете элемент, все остальные сдвигаются «влево» в списке, но Python все еще продвигает позицию. Это означает, что если у вас есть два нечетных числа в строке (например, 15
и 99
) (a) , удаление 15
перемещает 99
влево (туда, где 15
был), но следующая итерация будет искать, где 99
был до смещения, а не там, где он сейчас.
Например, рассмотрим список [1, 3, 6, 8]
, это шаги, которые Python предпримет:
List Pos newList newPos comment
---- --- ------- ------ -------
[1, 3, 6, 8] 0 [3, 6, 8] 1 Odd 1, delete, advance.
[3, 6, 8] 1 [3, 6, 8] 2 Even 6, leave, advance.
[3, 6, 8] 2 [3, 6, 8] 3 Even 8, leave, advance.
[3, 6, 8] 3 iteration finished.
Вы видите, что последовательные нечетные числа вызывают проблему здесь, он будет удалять только альтернативные.
Что касается решения: если, как ваш код предполагает, что вы просто хотите использовать четные числа в списке, вы можете использовать гораздо более сжатое (и Pythoni c) понимание списка (нет необходимости даже для этой функции):
myList = [10, 2, 3, 4, 5, 80, 15, 99]
evens = [item for item in myList if item % 2 == 0]
# gives [10, 2, 4, 80]
И, для полноты, поскольку ваше имя функции , кажется, указывает на то, что вы хотите получить старшее четное число, которое будет примерно таким:
biggestEven = max([item for item in myList if item % 2 == 0])
# gives 80
(a) Ваша проблема на самом деле не имеет ничего общего с тем фактом, что 99
i s в конце списка, любое последовательных нечетных чисел в любом месте списка может вызвать такую же проблему.