众所周知,交换两个项目 a
和 b
的值的pythonic方法是
a, b = b, a
它应该等同于
b, a = a, b
然而,今天在写一些代码的时候,无意中发现下面两个swap给出了不同的结果:
nums = [1, 2, 4, 3]
i = 2
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
print(nums)
# [1, 2, 4, 3]
nums = [1, 2, 4, 3]
i = 2
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
print(nums)
# [1, 2, 3, 4]
这让我难以置信。有人可以向我解释这里发生了什么吗?我认为在 Python 交换中,两个分配同时且独立发生。
原文由 Shaun Han 发布,翻译遵循 CC BY-SA 4.0 许可协议
来自 python.org
所以我将其解释为您的作业
大致相当于
(当然有更好的错误检查)
而另一个
就好像
因此,在这两种情况下,首先评估右侧。但是然后左边的两块按顺序求值,求值后马上做作业。至关重要的是,这意味着左侧的第二项仅 在 第一项分配完成后才进行评估。因此,如果您首先更新
nums[i]
,那么nums[nums[i] - 1]
指的是与更新nums[i]
不同的索引。