Для циклов и итерации по спискам
Вот фрагмент кода, который дает результат: 0 1 2 2
. Я ожидал выход 3 3 3 3
, так как a[-1]
обращается к номеру 3 в списке. Объяснение, данное онлайн, говорит: "Значение a[-1]
изменяется на каждой итерации", но я не совсем понимаю, как и почему. Любые объяснения были бы замечательными!
a = [0, 1, 2, 3]
for a[-1] in a:
print(a[-1])
Ответы
Ответ 1
То, что происходит здесь, это список, который мутируется во время цикла.
Рассмотрим следующий фрагмент кода:
a = [0, 1, 2, 3]
for a[-1] in a:
print a
Выход:
[0, 1, 2, 0]
[0, 1, 2, 1]
[0, 1, 2, 2]
[0, 1, 2, 2]
Каждая итерация:
- считывает значение из позиции, на которую указывает внутренний указатель
- немедленно назначает его последнему элементу в списке
- после того, как последний элемент напечатан на стандартном выходе
Так выглядит:
- внутренний указатель указывает на первый элемент, он 0, а последний элемент перезаписывается этим значением; список
[0, 1, 2, 0]
; напечатанное значение 0
Внутренний указатель - указывает на второй элемент, он 1, а последний элемент перезаписывается этим значением; список
[0, 1, 2, 1]
; напечатанное значение 1
- (...)
- на последнем шаге внутренний указатель указывает на последний элемент; последний элемент перезаписывается сам по себе - список не изменяется на последней итерации; печатный элемент также не изменяется.
Ответ 2
Выполняя for a[-1] in a
, вы фактически перебираете список и временно сохраняете значение текущего элемента в a[-1]
.
Вы можете видеть цикл как эти инструкции:
a[-1] = a[0] # a = [0, 1, 2, 0]
print(a[-1]) # 0
a[-1] = a[1] # a = [0, 1, 2, 1]
print(a[-1]) # 1
a[-1] = a[2] # a = [0, 1, 2, 2]
print(a[-1]) # 2
a[-1] = a[3] # a = [0, 1, 2, 2]
print(a[-1]) # 2
Итак, когда вы находитесь на третьем элементе, тогда 2
сохраняется в a[-1]
(значение которого 1
, но было 0
до и 3
при запуске).
Наконец, когда дело касается последнего элемента (и конца итерации), последнее значение, хранящееся в a[-1]
, равно 2
, что объясняет, почему оно печатается дважды.