Почему цикл «если» удаляет не все нечетные числа из списка (только каждое второе нечетное число)?

#python #if-statement

Вопрос:

Существует код:

 list = [1, 2]  while list[-1] list[-2] lt;= 4000000:  list.append(list[-1]   list[-2]) for i in list:  if i % 2 == 1:  print(i)  list.remove(i) print(list) print(sum(list))  

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

1. Не вызывайте свою переменную list , так как она затеняет встроенную list() функцию.

2. поскольку все числа в списке уникальны, а код проверяет наличие нечетного числа с помощью list.remove, чтобы удалить это число из списка, какого результата вы ожидаете ?

3. редактирование списка во время итерации приводит к сбоям в работе итератора, поэтому вы в конечном итоге пропускаете по одному номеру для каждого удаляемого файла

Ответ №1:

Вы не должны изменять список (или любой контейнер) во время его просмотра.

Один из способов обойти это-использовать другой контейнер,

 in_list = [1, 2]  while in_list[-1] in_list[-2] lt;= 20:  in_list.append(in_list[-1]   in_list[-2])  print(in_list)  out_list = [] for i in in_list:  if i % 2 != 1:  print(i)  out_list.append(i)  print(out_list) print(sum(out_list))  

В этом коде используется подход, отличный от вашего: он создает входной список, затем при повторении добавляет нужные элементы в новый выходной список. Это имеет тот же эффект, что и удаление нечетных элементов из списка входных данных, однако это не нарушает итерацию путем изменения списка входных данных.

Как было сказано в комментариях, вы не должны использовать встроенные имена («список») для имен ваших переменных-это затенит их. Кроме того, при разработке и отладке кода лучше придерживаться небольших примеров. Здесь я использую 20 вместо 4 000 000 — гораздо проще отслеживать и не теряет смысла.