为什么内联交换 returns 意外结果?

Why inline swapping returns unexpected result?

我正在尝试像这样交换 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]

问题是赋值是从左到右发生的,在计算 A[A[i] - 1] 以确定第二次赋值的目标之前修改了 A[i]

在您的第二个示例中,对 A[A[i] - 1] 的赋值不会影响第二个赋值的 A[i] 的结果。

尝试分配 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] <- 1
  • A[A[i]-1] = A[1-1] = A[0] <- 4
  • 最终结果:[4, 1, 3, 1]

内联交换的执行顺序有点复杂。

首先 评估右侧,形成两个元素的元组 - (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.