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