为什么内联交换 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)
。
其次,从左边开始赋值给左手:
第一个 A[i]
被分配 A[3]
即 A[i] = 1
.
则A[<b>A[i]</b> - 1]
变为A[<b>1</b> - 1]
即 A[0]
分配为 4.
我正在尝试像这样交换 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)
。
其次,从左边开始赋值给左手:
第一个
A[i]
被分配A[3]
即A[i] = 1
.则
A[<b>A[i]</b> - 1]
变为A[<b>1</b> - 1]
即A[0]
分配为 4.