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