Подтвердить что ты не робот

Для циклов и итерации по спискам

Вот фрагмент кода, который дает результат: 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])
4b9b3361

Ответ 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, что объясняет, почему оно печатается дважды.