Per the documentation:
Python вычисляет выражения слева направо. Обратите внимание, что в то время как , оценивая назначение, правая часть оценивается до левой стороны .
Для получения более подробной информации см. this section. Хороший пример мозгового тизера, использующего такое поведение here.
Это означает, что правая часть =
оценивается сначала, слева направо, а затем назначение выполняется с левой стороны, слева направо. Обязательно, скобки оцениваются наизнанку. Нарушение этого ступенчато вниз, вот первый пример:
i = 1
A = [3, 4, -1, 1]
A[A[i] - 1], A[i] = A[i], A[A[i] - 1]
= A[1], A[A[i] - 1]
= 4, A[A[i] - 1]
= 4, A[A[1] - 1]
= 4, A[4 - 1]
= 4, A[3]
= 4, 1
A[A[i] - 1], A[i] = 4, 1
A[A[1] - 1], A[i] = 4, 1
A[4 - 1], A[i] = 4, 1
A[3], A[i] = 4, 1 # A becomes [3, 4, -1, 4]
A[i] = 1
A[1] = 1 # A becomes [3, 1, -1, 4]
А вот второй:
i = 1
A = [3, 4, -1, 1]
A[i], A[A[i] - 1] = A[A[i] - 1], A[i]
= A[A[1] - 1], A[i]
= A[4 - 1], A[i]
= A[3], A[i]
= 1, A[i]
= 1, A[1]
= 1, 4
A[i], A[A[i] - 1] = 1, 4
A[1], A[A[i] - 1] = 1, 4 # A becomes [3, 1, -1, 1]
A[A[1] - 1] = 4
A[1 - 1] = 4
A[0] = 4 # A becomes [4, 1, -1, 1]
Отнесение к цели слева на левой стороне изменяет содержание A
, который изменяет индексацию в правой части. 4
присваивается либо A[3]
, либо A[0]
, в зависимости от значения A[1]
(который изменяется от 4
до 1
) при вычислении индекса.
«Каков наилучший способ выполнения такого рода множественных присвоений в одной строке?» - Я сделаю все возможное, чтобы этого избежать. Я не могу представить ни одной ситуации, когда необходимо было бы назначить движущиеся цели таким образом.
@Prune: Ни один из ответов там не обсуждает вид помех между назначениями, которые возникают в этом вопросе. – user2357112
Я просто сломал его до той же логической последовательности и воспроизвел проблему пользователя. Короче говоря, я * * получил те же самые взаимодействия. – Prune
@Prune: Вы видите что-то в тех ответах, что я нет? Ни один из них ничего не говорит о том, как присвоения и оценки чередуются в LHS, или как это может привести к тому, что задания мешают друг другу. – user2357112