为什么内联交换会返回意外结果?

时间:2019-07-09 16:11:20

标签: python swap

我正在尝试在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 个答案:

答案 0 :(得分:3)

尝试分配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]

答案 1 :(得分:2)

问题是分配从左到右发生,并且在评估A[i]以确定第二个分配的目标之前修改了A[A[i] - 1]

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

答案 2 :(得分:1)

内联交换的执行顺序并不复杂。

首先,对右侧进行评估,该右侧形成两个元素-(A[3], A[1])的元组,并存储在内存中。该值是事先计算的,其值是固定的,并且不取决于此分配所做的任何事情。因此,我们在右侧有(1, 4)

其次,这些值从左侧分配到左手:

  1. 第一个A[i]被分配了A[3],即 A[i] = 1

  2. 然后A[A[i] - 1]变成A[1 - 1]A[0]被分配为4。