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

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

2 Solutions collect form web for “для циклов и итерации по спискам”

То, что здесь происходит, – это список, который мутируется во время цикла.

Рассмотрим следующий фрагмент кода:

 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
  • (…)
  • на последнем шаге внутренний указатель указывает на последний элемент; последний элемент перезаписывается сам по себе – список не изменяется на последней итерации; печатный элемент также не изменяется.

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

  • как перезапустить цикл for for python?
  • Уменьшение для петель в Python невозможно?
  • Почему этот словарь python создается не по порядку с помощью setdefault ()?
  • Что означает дополнительный параметр в этом for-loop в Python?
  • ошибка сегментации в вычислении pi (python)
  • Вычислить текущую сумму во время цикла for - Python
  • Singleline for-loop для создания словаря?
  • «Pythonic» для цикла над целыми числами от 0 до k-1, за исключением i
  • Python - лучший язык программирования в мире.