我正在尝试在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]
答案 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)
。
其次,这些值从左侧分配到左手:
第一个A[i]
被分配了A[3]
,即 A[i] = 1
。
然后A[A[i] - 1]
变成A[1 - 1]
,A[0]
被分配为4。