когда for итерируется по списку, а внутри цикла количество элементов списка меняется, то может произойти ситуация, когда for обращается к следующему по индекс-у элементу, а его нет уже и можно получить ошибку IndexError.
Может. Вот пример. Если убрать строку z.pop(), то все ок. С ней, идёт изменения самого списка.
Но если использовать не range, а просто сам итерируемый объект для перебора, то цикл закончится как только объект дойдёт до предела перебора (закончится или обнулится).
z = list('qwerty')
for i in range(len(z)):
z.pop()
print(z[i])