Почему list.remove() неправильно удаляет элементы в цикле?

1,00
р.
В основном я занимаюсь разработкой на C/C++, но появилась задача написания приложения на Python-3 и я столкнулся с некоторым непониманием работы интерпретатора.
Я допустил ошибку и некоторое время не замечал ее, так как Python сделал все "почти" правильно. Задача состояла в удалении из списка N/2 значений, где N - общее их количество.
Простой пример описывающий ситуацию:
array = []
for i in range(10): array.append(i) # array [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
i = 0 for item in array: if i < len(array)/2: array.remove(item)
# array [1, 3, 5, 7, 9]
Как вы заметили, я не инкрементирую переменную i во втором цикле, но интерпретатор каким то образом все равно удаляет из массива нулевой и каждый четный элемент.
Собственно вопрос, как это работает?

Ответ
Всё просто - вы модифицируете итерируемый массив
Step 1: array=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] index = 0 array[index] = 0 Удаляется 0. Step 2: array=[1, 2, 3, 4, 5, 6, 7, 8, 9] index = 1 array[index] = 2 Удаляется 2. Step 3: array=[1, 3, 4, 5, 6, 7, 8, 9] index = 2 array[index] = 4 Удаляется 4.
И так далее.
Этот цикл аналогичен циклу:
for (int i = 0 i < vec.size() ++i) vec.erase(vec.begin() + i)
Модификация массива меняет последовательность итерируемых элементов.

Удалить же половину элементов массива можно просто создав новый срез:
array = array[len(array)//2:] # [4, 5, 6, 7, 8]