Eliminar de una lista mientras itera sobre ella

El siguiente código:

a = list(range(10))
remove = False
for b in a:
    if remove:
        a.remove(b)
    remove = not remove
print(a)

Outputs[0, 2, 3, 5, 6, 8, 9], en lugar de[0, 2, 4, 6, 8] cuando se usa Python 3.2.

¿Por qué genera estos valores particulares? ¿Por qué no se da ningún error para indicar que el iterador subyacente se está modificando? ¿Ha cambiado la mecánica de las versiones anteriores de Python con respecto a este comportamiento?

enga en cuenta que no estoy buscando evitar el comportamiento, sino entenderlo.