Я не понимаю, почему приведенный ниже код не ведет себя так же, как второй фрагмент кода:
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 во второй итерации, как это было сделано.