Почему next внутри al oop, который повторяет итератор, не ведет себя так же, как pop? - PullRequest
0 голосов
/ 08 мая 2020

Я не понимаю, почему приведенный ниже код не ведет себя так же, как второй фрагмент кода:

a = iter(list(range(10)))
for i in a:
    print(i)
    next(a)

Output:
0
2
4
6
8

Второй фрагмент:

a = list(range(10))
for i in a:
    print(i)
    a.pop(0)

Output:
0
2
4
6
8

Я пришел к выводу, что в фрагменте с pop, for l oop отслеживает индекс списка, который он повторяет, так как сначала он печатает 0, затем выдает 0, и, как и в первой итерации, i был присвоен индекс 0, во второй итерации, однако, это должен быть индекс 1, что и есть. Таким образом, он печатает все, что находится в индексе 1, который сейчас равен 2, а не 1, поскольку 0 был вытянут. Et c ...

Однако во фрагменте, где мы выполняем итерацию итератора, поведение, похоже, не такое же. На первой итерации он присваивает i значение 0, что означает, что он его использовал. Теперь, после печати i, мы используем функцию next, которая вернет 1 и также потребляет его, то есть по индексу 0 теперь 2. Во второй итерации для l oop теперь будет индекс 1, что означает, что i должно быть присвоено 3, а не 2.

У меня есть идея, почему это не так. работают таким образом, но я не уверен и был бы очень признателен за дальнейшие объяснения:

-Поскольку итераторы не имеют подписок, у них нет индексов, насколько мне известно, поэтому for l oop не будет не работает, если он будет использовать индексы, в отличие от итерации списка, как во втором фрагменте. Делая вывод, что for l oop всегда будет просто использовать следующий элемент в итераторе, что будет означать, что он присвоит i 2 во второй итерации, как это было сделано.

...