Почему встроенная замена возвращает неожиданный результат? - PullRequest
2 голосов
/ 09 июля 2019

Я пытаюсь поменять два объекта в Python, как это A[i], A[A[i] - 1] = A[A[i] - 1], A[i] не дает мне правильный вывод

В соответствии с порядком операции: https://docs.python.org/3/reference/expressions.html#evaluation-order правая часть разрешается первойа затем выполните задание слева направо.Предположим, i = 1, тогда мы получим A[1], A[3] = A[3], A[1]

. Предположим, A = [-1, 4, 3, 1] и i = 1, где i - индекс

A[i], A[A[i] - 1] = A[A[i] - 1], A[i] 

. В результате я получу [4,1,3,1], хотя я ожидалчтобы получить [-1, 1,3,4] то есть A[1], A[3] = A[3], A[1]

Но когда я делаю это, я получаю правильное значение [-1,1,3,4].Почему этот работает, а выше не работает?

A[A[i] - 1], A[i] = A[i], A[A[i] - 1]

Ответы [ 3 ]

3 голосов
/ 09 июля 2019

При попытке присвоить A[A[i] - 1], A[i] уже изменилось.

Давайте разберем это с i = 1:

Сначала вычисляются выражения с правой стороны:

  • В этот момент A[i] = A[1] = 4
  • Итак A[A[i]-1] = A[4-1] = A[3] = 1

Теперь назначения слева направо:

  • A[i] = A[1] <- <code>1
  • A[A[i]-1] = A[1-1] = A[0] <- <code>4
  • окончательный результат: [4, 1, 3, 1]
2 голосов
/ 09 июля 2019

Проблема заключается в том, что назначения выполняются слева направо, и A[i] изменяется до оценки A[A[i] - 1] для определения цели для второго назначения.

Во втором примере присвоение A[A[i] - 1] не влияет на результат A[i] для второго присвоения.

1 голос
/ 09 июля 2019

Порядок выполнения внутренней замены немного сложен.

Первый вычисляется правая часть, которая образует кортеж из двух элементов - (A[3], A[1]) и сохраняется в памяти.Это вычисляется ранее, и его значение является фиксированным и не зависит от того, что делает это назначение.Таким образом, у нас есть (1, 4) с правой стороны.

Во-вторых , значения присваиваются левой руке с левой стороны:

  1. Первый A[i] присваивается A[3], т. Е. A[i] = 1.

  2. Затем A[<b>A[i]</b> - 1] становится A[<b>1</b> - 1], что A[0] назначается как 4.

...