#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]
Комментариев нет:
Отправить комментарий