Python 顺序更改时交换会导致意外结果

Python swap leads to unexpected results when order changes

Python 支持 1 行 A/B 交换 (A , B = B , A),我们预计 (B, A = A, B) 会导致相同的结果。但是,我在处理列表条目时遇到了一个奇怪的行为。我在下面的代码中简化了我的发现:

nums = [0, 0, 0, 0]
n = 2
print(nums, "expected case")
nums[n - 1], n = n, nums[n - 1]
print(n, nums)

nums = [0, 0, 0, 0]
n = 2
print(nums, "unexpected case")
n, nums[n - 1] = nums[n - 1], n
print(n, nums)

下面是执行上面程序的输出:

[0, 0, 0, 0] expected case
0 [0, 2, 0, 0]
[0, 0, 0, 0] unexpected case
0 [0, 0, 0, 2]

问题:为什么上面的顺序改变会导致不同的结果?似乎在意外情况下,在 nums[-1] 更新之前,n 首先被分配给 0。

您的假设(A, B = B, AB, A = A, B 是等价的陈述)仅当 AB 不相互依赖时才成立。问题在于,在这两种情况下,正确的表达式都是您所期望的,而不是左侧的。在一种情况下,nnums[n-1] 之前被分配(到 0),因此您实际上访问了列表的第 0-1=-1-n 个情况(这是最后一个,如示例所示).在另一种情况下,n-1之前计算 n再次分配,因此nums[n-1]对应于nums[1]。请记住,表达式是从左到右“求值”的,即使在赋值时也是如此。