Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Удаление каждого четного при неправильном условии ветвления в цикле

#python #python_3x


В основном я занимаюсь разработкой на 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 во втором цикле, но интерпретатор
каким то образом все равно удаляет из массива нулевой и каждый четный элемент. 

Собственно вопрос, как это работает? 
    


Ответы

Ответ 1



Всё просто - вы модифицируете итерируемый массив 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]

Комментариев нет:

Отправить комментарий