Почему цикл for неожиданно останавливается во время итерации списка, когда список удаляется? - PullRequest
0 голосов
/ 19 мая 2019

Проблема заключается в последнем блоке цикла. Это должно вывести список экспозиции, чтобы завершить исчезновение, но оно останавливается на длине 32. Я не могу себе представить, почему.

Я попробовал метод list.pop, а также, как показано, оператор del. Оба вызывают одну и ту же ошибку.

def generator(): # generator which generates like 2,4,8,16 -> 2 to the power of x
    list = range(1,65)
    for i in list:
        yield 2**i

mygen = generator() # generator object

expo = [] # empty list for the exponential values

for i in mygen: # for loop to put the values of the genertor in list form
    expo.append(i)
    print(expo)

for i in expo: # attempt to delete the last element, but stops at list with length 32
    del expo[-1]
    print(expo)

Я ожидал, что список будет удален, поскольку он был построен поэтапно. Он должен стать [], но становится len (expo) = 32.

Так почему же это останавливается?

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Вы удаляете список, по которому вы выполняете итерацию, в результате чего удаляется только половина списка, а затем итерация останавливается на 32 элементах (так как длина списка expo равна 64, половина его равна 32

У вас есть два варианта:

  • Повторять копию списка и удалять фактический список.
#Iterating on copy of expo
for i in expo[:]:
    del expo[-1]
    print(expo)
  • Используйте list.clear чтобы очистить список за один шаг вместо цикла for

Из документов: https://docs.python.org/3/tutorial/datastructures.html

list.clear ()
Удалитьвсе элементы из списка. Эквивалентно del a [:].

expo.clear()
print(expo)
#[]
1 голос
/ 19 мая 2019

Вы постоянно удаляете последний элемент списка expo[-1] Так что, когда вы очистили ~ половину своего списка (32/64 элемента), просто больше нет значений для итерации, и итерация останавливается.

Как правило, манипулировать серединой списка обычно плохая идея, так как может произойти такое неожиданное поведение.

...