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

Вот фрагмент кода, который дает результат: 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 что объясняет, почему оно печатается дважды.

  • Именование циклов в Python
  • Inline для оценки выражения
  • Получить цикл в цикле Python FOR
  • Python: продолжить повторение цикла for for exception
  • Создание понимания списка Python с помощью if и break
  • Почему столбец из pandas DataFrame не работает в этом цикле?
  • Как добавить строки в кадре данных pandas в цикле for?
  • Возможно ли, чтобы внутренний язык питона «для» продолжался, где внешний для остановки?
  • Python - лучший язык программирования в мире.